P3^4:
从一个集成信号中分离出某一个位
比如 P3^4 就是取P3信号中的第3位
因为4代表二进制数的第3位
即 十进制(4) = 二进制(0100)
P3^4 就是 ABCD &0100 (ABCD是P3的4个信号位)
P3信号第3位就是B位
如果 B为1 即 1与1 结果为1 KEY3的值就是1
如果 B为0 即 0与1 结果为0 KEY3的值就是0
高电平
高电平:就是与低电平相对的高电压,是电工程上的一种说法。
在逻辑电平中,保证逻辑门的输入为高电平时所允许的最小输入高电平,当输入电平高于输入高电压(Vih)时,则认为输入电平为高电平。
在数字逻辑电路中,低电平表示0,高电平表示1。一般规定低电平为0~0.25V,高电平为3.5~5V。
也有其他的可能,如在移动设备中电池的电压会随使用时间的的推移而降低,如果规定高电平最低为3.5V的话可能设备的使用时间会大大降低,此时规定的高电平电压会低一点,最低会有1.7V左右。
* 实 验 名 : 汉字移动显示
* 实验说明 :
* 连接方式 : 见接线图
* 注 意 :
*******************************************************************************/
#include <REG51.H>
#include <intrins.h>
#include "array1.h"
//--重定义函数变量--//
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
//--定义SPI要使用的 IO--//
sbit MOSIO = P3^4; //取P3信号的第三位
sbit R_CLK = P3^5;
sbit S_CLK = P3^6;
//--全局函数声明--//
void HC595SendData( uchar BT3, uchar BT2,uchar BT1,uchar BT0);
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main(void)
{
int k, j, ms;
//--定义一个指针数组指向每个汉字--//
uchar *p[] =
{tab17, tab1, tab2, tab3, tab4, tab5, tab6, tab7, tab8,
tab9, tab10,/* tab11, tab12, tab13, tab14, tab15,*/ tab16};
while(1)
{
for(ms = 15; ms > 0; ms--) //移动定格时间设置
{
for(k = 0; k < 16; k++) //显示一个字
{
HC595SendData(~(*(p[0] + 2*(k+j) + 1)),~(*(p[0] + 2*(k+j) )),tab0[2*k],tab0[2*k + 1]); //因为字模软件取的数组是高电平有效,所以列要取反
}
//--清屏--//
HC595SendData(0xff,0xff,0,0); //清屏
}
j++;
if(j == (17*10) ) //有几个字乘几
{
j = 0;
}
}
}
/*******************************************************************************
* 函 数 名 : HC595SendData
* 函数功能 : 通过595发送四个字节的数据
* 输 入 : BT3:第四个595输出数值
* * BT2: 第三个595输出数值
* * BT1:第二个595输出数值
* * BT0:第一个595输出数值
* 输 出 : 无
*******************************************************************************/
void HC595SendData( uchar BT3, uchar BT2,uchar BT1,uchar BT0)
{
uchar i;
//--发送第一个字节--//
for(i=0;i<8;i++)
{
MOSIO = BT3 >> 7 ; //从高位到低位
BT3 <<= 1;
S_CLK = 0;
S_CLK = 1;
}
//--发送第一个字节--//
for(i=0;i<8;i++)
{
MOSIO = BT2 >>7; //从高位到低位
BT2 <<= 1;
S_CLK = 0;
S_CLK = 1;
}
//--发送第一个字节--//
for(i=0;i<8;i++)
{
MOSIO = BT1 >> 7; //从高位到低位
BT1 <<= 1;
S_CLK = 0;
S_CLK = 1;
}
//--发送第一个字节--//
for(i=0;i<8;i++)
{
MOSIO = BT0 >> 7; //从高位到低位
BT0 <<= 1;
S_CLK = 0;
S_CLK = 1;
}
//--输出--//
R_CLK = 0; //set dataline low
R_CLK = 1; //片选
R_CLK = 0; //set dataline low
}