本帖最后由 javastory 于 2021-5-13 16:36 編輯
我的問題是,給的數據是temp=0x7e,就是讓點陣0和7列不亮,其他都亮,但是現在的現象是,在proteus里一步一步執行,每列導通的時候,行數據會變化2-3次,感覺是行、列數據不同步,但是printf輸出的數據都是正確的數據。不知道問題在哪里,幫忙看看程序哪里錯了嗎?
8*8的點陣掃描代碼,程序如下:
- #include <reg52.h>
- #include <intrins.h>
- #include <stdio.h>
- #define ITM_Port8(n) (*((volatile unsigned char *)(0xE0000000+4*n)))
- #define ITM_Port16(n) (*((volatile unsigned short*)(0xE0000000+4*n)))
- #define ITM_Port32(n) (*((volatile unsigned long *)(0xE0000000+4*n)))
- #define DEMCR (*((volatile unsigned long *)(0xE000EDFC)))
- #define TRCENA 0x01000000
- char putchar(char s)
- {
- SBUF=s;
- while(TI==0)
- {
- _nop_();
- }
- TI=0;
- }
- sbit ADDR0 = P2^0;
- sbit ADDR1 = P2^1;
- sbit ADDR2 = P2^2;
- sbit ADDR3 = P2^3;
- sbit COW_1641 = P0^0;
- //sbit COW_1642 = P0^2;
- sbit CLK_1641 = P0^1;
- sbit CLK_1642 = P0^3;
- sbit CLE_1641 = P0^2;
- unsigned char colcount[16]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
- unsigned char code image[8] = {0x00,0x00,0x7E,0x50,0x50,0x50,0x00,0x00};
- unsigned char i = 0; //動態掃描的索引
- unsigned int cnt = 0; //記錄 T0 中斷次數
- unsigned char flag1s = 0; //1 秒定時標志
- void delay(unsigned int delay){
- unsigned char i;
- for(;delay>0;delay--)
- for(i=0;i<150;i++);
- }
- void main(){
- unsigned long sec = 0; //記錄經過的秒數
- EA = 1; //使能總中斷
- CLE_1641 = 1;
- TMOD = 0x01; //設置 T0 為模式 1
- TH0 = 0xFC; //為 T0 賦初值 0xFC67,定時 1ms
- TL0 = 0x67;
- ET0 = 1; //使能 T0 中斷
- TR0 = 1; //啟動 T0
- while ( 1 ) {
-
- }
- }
- /* 定時器 0 中斷服務函數 */
- void InterruptTimer0() interrupt 1 {
- unsigned int col,coldata,speed;
- unsigned char temp;
- TH0 = 0xFC; //重新加載初值
- TL0 = 0x67;
- cnt++; //中斷次數計數值加 1
- if (cnt >= 1000) //中斷 1000 次即 1 秒
- {
- cnt = 0; //清零計數值以重新開始下 1 秒計時
- flag1s = 1; //設置 1 秒定時標志為 1
- }
- //以下代碼完成數碼管動態掃描刷新
- for (col=0;col<8;col++){
- P2=col;
- //temp=image[col];
- temp=0x7E;
- printf("col = %u temp 1 = 0x%lX \n", col, temp);
- for(coldata=0;coldata<8;coldata++){
-
- printf("coldata = %u temp&0x80 = 0x%lX \n",coldata,temp);
- CLK_1641 = 0;
- COW_1641=temp&0x01;
- printf("coldata = %u COW_1641 = 0x%lX \n",coldata,COW_1641);
- CLK_1641 = 1;
- temp>>=1;
-
- printf("temp <<1 = 0x%lX \n",temp);
- }
- }
- }
復制代碼
|