|
問題描述:我想寫一個程序想要達到目的是:通過矩陣鍵盤s1~s10分別代表數字0~9,按下矩陣鍵盤代表的數字然后在數碼管的最左兩位顯示出來。想要達到的效果就像計算器那樣當有第一個數字輸入時,在最右側顯示;當有第二個數字輸入時,最右側數字向左移動一位,空出來的位置顯示第二個數字。
我的思路是:定義一個兩字節數組,初值都是0,分別存放個位和十位。第一個輸入的數字存入個位,當有第二個數字輸入時,先把個位的值存入十位,再將第二個數字存入個位。
下面是我寫的一段不完整的代碼:請會的大神幫我完成一下代碼或者按照你的思路給我一個參考代碼,謝謝您!(我用的板子是單核A2開發板)
單片機代碼:
- #include
- #define uchar unsigned char
- #define uint unsigned int
- uchar seg_value[2]; //數碼管編碼存儲,數組的0、1位分別存儲個位、十位
- void delay1();
- uchar KEY_SCAN();
- void seg_updata(uchar x);
- void SEG_display();
- uchar code seg_table[] = {0xc0,0xf9,0xa4,0xb0, //定義一個數組,將0~f對應的編碼存入數組
- 0x99,0x92,0x82,0xf8,
- 0x80,0x90,0x88,0x83,
- 0xc6,0xa1,0x86,0x8e};
- sbit LSA=P2^2;
- sbit LSB=P2^3;
- sbit LSC=P2^4;
- void delay1()
- {
- uint i;
- for(i = 0;i<1000;i++);
- }
- uchar KEY_SCAN()
- {
- uchar key_buf; //暫時存儲P1口狀態
- uchar key_state; //存儲按鍵狀態
- P1 = 0xf0; //高四位高電平,第四位低電平
- key_buf = P1; //讀取P1口狀態
- if(key_buf != 0xf0)
- {
- delay1(); //延時消抖
- if(P1 == key_buf) //再次判斷是否有按鍵按下
- {
- key_state = key_buf & 0xf0; //高四位狀態存入key_state
- P1 = 0x0f; //高四位低電平,第四位高電平
- key_buf = P1; //讀取P1口狀態
- key_state = key_state | key_buf; //第四位狀態存入key_state
- return key_state; //返回該按鍵坐標值(請允許我用坐標形容這個值)
- }
- else
- return 0; //如果沒有按鍵按下,返回0
- }
- else
- return 0; //如果沒有按鍵按下,返回0
- }
- /***************************************************
- * 鍵值判斷子函數
- * 判斷按鍵值,更新到數組seg_value[]
- ****************************************************/
- void seg_updata(uchar x)
- {
- uchar table_num; //存儲字符在數組中對應的編號
- switch(x)
- {
- case 0x77: table_num = 0;break; //S1被按下時,對應數字0
- case 0x7b: table_num = 1;break; //S2被按下時,對應數字1,
- case 0x7d: table_num = 2;break;
- case 0x7e: table_num = 3;break;
- case 0xb7: table_num = 4;break;
- case 0xbb: table_num = 5;break;
- case 0xbd: table_num = 6;break;
- case 0xbe: table_num = 7;break;
- case 0xd7: table_num = 8;break;
- case 0xdb: table_num = 9;break;
- default: table_num = 10; //如有其它坐標值,不作處理
- }
- if(table_num<10)
- {
- seg_value[1] = seg_value[0];
- seg_value[0] = seg_table[table_num];
- }
- }
- /***************************************************
- * 數碼管顯示子函數
- * 每隔一段時間,更新數據
- ****************************************************/
- void SEG_display()
- {
- uint i;
- for(i=0;i<2;i++)
- {
- switch(i) //位選,選擇點亮的數碼管,
- {
- case(0):
- LSA=0;LSB=0;LSC=0; break;
- case(1):
- LSA=1;LSB=0;LSC=0; break;
- }
- P0=seg_value[i];//發送段碼
- delay1(); //間隔一段時間掃描
- P0=0x00;//消隱
- }
- }
- void main()
- {
- uchar key_value;
- uint state_cnt=1;
- while(1)
- {
- SEG_display();
- }
- }
復制代碼
223355z5fffkp6mtfz2zu2.png (39.1 KB, 下載次數: 24)
下載附件
2020-7-15 22:57 上傳
223402n22xh7mxjd6egljz.png (45.34 KB, 下載次數: 32)
下載附件
2020-7-15 22:57 上傳
223407orezwsg9uwow4qzw.png (96.29 KB, 下載次數: 25)
下載附件
2020-7-15 22:57 上傳
223412u196w29g1962kr81.png (185.17 KB, 下載次數: 24)
下載附件
2020-7-15 22:57 上傳
|
-
-
A2開發板原理圖.pdf
2020-7-15 22:28 上傳
點擊文件名下載附件
227.86 KB, 下載次數: 5
|