本帖最后由 大智慧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上的圖是一致的
|