本帖最后由 大智慧152 于 2020-6-12 13:06 编辑
如图两个字模是相同的,主要参考https://blog.csdn.net/zh_j_wei/article/details/104192813所写但是最终显示字模不完全
附上源代码
- #include <reg51.h>
- #include <intrins.h>
- #define GPIO_KEY P1 //独立键盘用P1口
- //--重定义函数变量--//
- #define uchar unsigned char
- #define uint unsigned int
- #define ulong unsigned long
- unsigned char Key_Scan();
- void Delay10ms(uint z);
- void translation();
- void twinkle1();
- void twinkle2();
- uint k,i,j,ms;
- uchar keyNum;
- //--定义SPI要使用的 IO--//
- sbit MOSIO = P3^4;
- sbit R_CLK = P3^5;
- sbit S_CLK = P3^6;
- //通过74HC595发送四个字节的数据
- 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
- }
- //点阵显示数组
- uchar code tab0[] = {0x00, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08,
- 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80,
- 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00,
- 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, 0x00};
- //--张--//
- uchar code tab1[] = {128,1,191,49,176,49,176,25,176,13,190,7,134,1,230,255,134,7,190,13,176,13,176,25,176,49,176,103,158,195,140,1};
- //--李--//
- uchar code tab2[] = {128,0,128,0,254,63,160,2,144,4,136,8,6,48,240,3,0,1,128,0,254,63,128,0,128,0,224,0,0,0,0,0};
- //--王--//
- uchar code tab3[] = {0,0,252,31,128,0,128,0,128,0,128,0,128,0,248,15,128,0,128,0,128,0,128,0,128,0,254,63,0,0,0,0};
- //--任--//
- uchar code tab4[] = {16,0,16,28,208,3,8,2,8,2,12,2,10,2,232,63,8,2,8,2,8,2,8,2,8,2,200,31,0,0,0,0};
- //--徐-//
- uchar code tab5[] = {16,2,16,2,8,5,132,8,82,16,176,47,8,2,12,2,202,31,8,2,72,18,72,34,40,34,136,3,0,0,0,0};
- //--五角星--//
- uchar code char1[] = {128,1,128,1,192,3,192,3,192,3,96,6,127,254,6,96,28,56,48,12,48,12,152,27,248,30,56,28,12,48,0,0};
- //--圆--//
- uchar code char2[] = {0,0,224,7,120,30,28,56,28,56,14,112,14,112,14,112,14,112,14,112,28,56,28,56,120,30,224,7,0,0,0,0};
- //--三角--//
- uchar code char3[] = {0,0,128,1,128,1,192,3,192,3,96,6,96,6,48,12,48,12,24,24,24,24,12,48,12,48,254,127,0,0,0,0};
- //--菱形--//
- uchar code char4[] = {128,0,64,1,32,2,16,4,8,8,4,16,2,32,1,64,2,32,4,16,8,8,16,4,32,2,64,1,128,0,0,0};
- //--箭头--//
- uchar code char5[] = {0,0,0,0,0,0,0,2,0,4,0,8,0,16,0,32,126,64,0,32,0,16,0,8,0,4,0,2,0,0,0,0};
- uchar *p[] = {tab1, tab2, tab3, tab4, tab5};
- uchar *c[] = {char1, char2, char3, char4,char5};
- void main(void)
- {
- while(1)//死循环
- {
- HC595SendData(0xff,0xff,0,0); //清屏
- keyNum=Key_Scan(); //读取键值
- switch (keyNum)
- {
- case(0xFE) : //返回按键K1的数据
- translation();//文字从上到下平移
- break;
- case(0xFD) : //返回按键K2的数据
- twinkle1(); //文字闪烁
- break;
- case(0xFB) : //返回按键K3的数据
- twinkle2(); //符号闪烁
- break;
- case(0x7F) : //返回按键K0的数据
- HC595SendData(0xff,0xff,0,0); //清屏
- break;
- default:
- break;
- }
- }
- }
- unsigned char Key_Scan()
- {
- unsigned char keyValue = 0 , i; //保存键值
- //--检测按键1--//
- if (GPIO_KEY != 0xFF) //检测按键K1是否按下
- {
- Delay10ms(5); //消除抖动
- if (GPIO_KEY != 0xFF) //再次检测按键是否按下
- {
- keyValue = GPIO_KEY;
- i = 0;
- while ((i<50) && (GPIO_KEY != 0xFF)) //检测按键是否松开
- {
- Delay10ms(5);
- i++;
- }
- }
- }
- return keyValue; //将读取到键值的值返回
- }
- //消除抖动(延时)
- void Delay10ms(uint z)
- {
- uint j;
- while(z--)
- {
- j=5000;
- while(j--);
- }
- }
- //文字由上而下平移
- void translation()
- {
- j=0;
- while(keyNum!=0x7F)
- {
- for(ms = 10; 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]);
- //因为字模软件取的数组是高电平有效,所以列要取反
- keyNum=Key_Scan();
- if(keyNum==0x7F)
- break;
- }
- HC595SendData(0xff,0xff,0,0); //清屏
- if(keyNum==0x7F)
- break;
- }
- j++;
- if(j == (10*15) )
- {
- j = 0;
- }
- }
- }
- //文字闪烁
- void twinkle1()
- {
- while(keyNum!=0x7F)
- {
- for(i = 0; i < 5; i++) //总共5个字
- {
- for(ms = 50; ms > 0; ms--) //显示50次,即肉眼可识别的停留时间
- {
- for(k = 0; k < 16; k++) //显示一个字
- {
- //--因为字模软件取的数组是高电平有效,所以列要取反--//
- HC595SendData(~(*(p[i] + 2*k + 1)),~(*(p[i] + 2*k )),
- tab0[2*k],tab0[2*k + 1]);
- keyNum=Key_Scan();
- if(keyNum==0x7F)
- break;
- }
- HC595SendData(0xff,0xff,0,0); //清屏
- if(keyNum==0x7F)
- break;
- }
- if(keyNum==0x7F)
- break;
- }
- }
- }
- //符号闪烁
- void twinkle2()
- {
- while(keyNum!=0x7F)
- {
- for(i = 0; i <5; i++) //总共5个符号
- {
- for(ms = 50; ms > 0; ms--) //显示50次,即肉眼可识别的停留时间
- {
- for(k = 0; k < 16; k++) //显示一个字
- {
- //--因为字模软件取的数组是高电平有效,所以列要取反--//
- HC595SendData(~(*(c[i] + 2*k + 1)),~(*(c[i] + 2*k )),
- tab0[2*k],tab0[2*k + 1]);
- keyNum=Key_Scan();
- if(keyNum==0x7F)
- break;
- }
- HC595SendData(0xff,0xff,0,0); //清屏
- if(keyNum==0x7F)
- break;
- }
- if(keyNum==0x7F)
- break;
- }
- }
- }
复制代码
proteus和https://blog.csdn.net/zh_j_wei/article/details/104192813上的图是一致的
|