bs8412c-3 學(xué)習(xí)_中斷,匯編與C語言
單片機源程序如下:- #include "BS84C12A-3.h"
- #include "BS84C12A_LIBV413/BS84C12A_LIBV413.h"
- #include <string.h>
- #include "SMG.H"
- extern void DISPLAY();
- extern void CLEAR();
- extern void PG_RESET();
- extern void TIME_ZHONGDUAN(); // 本來是匯編中的外部定時中斷,現(xiàn)有聲明為外部程序
- extern unsigned char LEDMATRIX_DISP_NUM[];
- extern unsigned char LEDMATRIX_DISP_RAM[];
- extern unsigned char TOUCHED;
- extern void LOAD_TKS_GLOBE_VARIES(); //;load TKS varies
- extern void LOAD_HXT_REFERENCE(); //;load HXT varies
- #define u8 unsigned char
- #define u16 unsigned int
- #define BEEP_PORT _pa7 // BEEP 引腳
- #define BEEP_PORT_CTRL _pac7 // BEEP 引腳控制,為 0 時允許輸出
- #define COPY_SEGA _pb4
- #define COPY_SEGB _pb5
- #define COPY_SEGC _pb6
- #define COPY_SEGD _pb7
- #define COPY_SEGE _pc0
- #define COPY_SEGF _pc1
- #define COPY_SEGG _pc2
- #define COPY_SEGDP _pb3
- #define COPY_COM1 _pd3
- #define COPY_COM2 _pd2
- #define COPY_COM3 _pd0
- #define COPY_COM4 _pd1
- const u8 dispcode[10]={0x3F,0x6,0x5B,0x4F,0x66,0x6D,0x7D,0x7,0x7F,0x6F};
- u8 dispbuff[4];
- u8 temp;
- char num1;
- char num2;
- unsigned int My_1MS_COUNTER;
- /*
- * 初始化中斷設(shè)置
- */
- void initial()
- {
- _tmrc = 0b00010111;
- _tmr = 256-(1000*8/128); // 8M 主頻
- _te = 1; // 使能定時/ 計數(shù)器中斷
- _emi = 1; // 使能總中斷
- // BEEP
- BEEP_PORT_CTRL = 0;
- BEEP_PORT = 0;
- }
- void smginit()
- {
- //seg口設(shè)置為輸出
- COPY_SEGA=0;
- COPY_SEGB=0;
- COPY_SEGC=0;
- COPY_SEGD=0;
- COPY_SEGE=0;
- COPY_SEGF=0;
- COPY_SEGG=0;
- COPY_SEGDP=0;
-
- _pbc4=0;
- _pbc5=0;
- _pbc6=0;
- _pbc7=0;
- _pcc0=0;
- _pcc1=0;
- _pcc2=0;
- _pbc3=0;
- //com口設(shè)置為輸出
- COPY_COM1=0;
- COPY_COM2=0;
- COPY_COM3=0;
- COPY_COM4=0;
- _pdc3=0;
- _pdc2=0;
- _pdc0=0;
- _pdc1=0;
-
- }
-
- DEFINE_ISR(My_Time_ISR_New, 0x0c) // 定時器中斷
- {
- _clrwdt1();
- _clrwdt2();
-
- smgscan(); //掃描數(shù)碼管,這里隨主循環(huán)不定時的掃描,如果程序復(fù)雜時間保證不了足夠快,
- //可能會有閃爍,這樣的話,只能開一個時基中斷或放進定時器中斷里,
-
- My_1MS_COUNTER++;
- if(My_1MS_COUNTER>500)
- {
- My_1MS_COUNTER = 0;
- // smgscan();
-
- }
- }
-
- void dispnum(u16 num) //
- {
- dispbuff[0]=dispcode[num/1000%10];
- dispbuff[1]=dispcode[num/100%10];
- dispbuff[2]=dispcode[num/10%10];
- dispbuff[3]=dispcode[num%10];
- }
- //將一個字節(jié)每一個bit送至相應(yīng)的io
- void setseg(u8 num)
- {
- mybit a;
- a.data=num;
- if(a.b.b0)COPY_SEGA=1;else COPY_SEGA=0;
- if(a.b.b1)COPY_SEGB=1;else COPY_SEGB=0;
- if(a.b.b2)COPY_SEGC=1;else COPY_SEGC=0;
- if(a.b.b3)COPY_SEGD=1;else COPY_SEGD=0;
- if(a.b.b4)COPY_SEGE=1;else COPY_SEGE=0;
- if(a.b.b5)COPY_SEGF=1;else COPY_SEGF=0;
- if(a.b.b6)COPY_SEGG=1;else COPY_SEGG=0;
- if(a.b.b7)COPY_SEGDP=1;else COPY_SEGDP=0;
-
- }
- //選擇com口
- void setcom(u8 index)
- {
- switch(index)
- {
- case 0:COPY_COM1=1;break;
- case 1:COPY_COM2=1;break;
- case 2:COPY_COM3=1;break;
- case 3:COPY_COM4=1;break;
- default:break;
- }
- }
- void smgscan()
- {
- static u8 index=0;
- COPY_COM1=COPY_COM2=COPY_COM3=COPY_COM4=0; //消影
- setseg(dispbuff[index]); //輸出seg口
- setcom(index); //輸出com口
- if(++index>3)index=0;
- }
- /*
- * 延時函數(shù)
- */
- void delay(unsigned short ms)
- {
- unsigned short i, j;
-
- for (i=0; i<ms; ++i) {
- for (j=0; j<200; j++) {
- _clrwdt1();
- _clrwdt2();
- }
- }
- }
- /*
- * 使用數(shù)碼管顯示數(shù)字
- * pos 為 0 顯示在左側(cè)兩個,為 1 顯示右側(cè)兩個
- * temp 為溫度的數(shù)值
- */
- void dispNumber(unsigned char pos, unsigned char num)
- {
- LEDMATRIX_DISP_NUM[pos*2] = num / 10;
- LEDMATRIX_DISP_NUM[pos*2+1] = num % 10;
- }
- void beep(unsigned short ms)
- {
- BEEP_PORT = 1;
- delay(ms);
- BEEP_PORT = 0;
- }
- void main()
- {
- PG_RESET();
- initial();
- beep(200);
-
- smginit();
- dispnum(1234);
-
- // num1 = 20;
- // num2 = 19;
- //
- // dispNumber(0, num1);
- // dispNumber(1, num2);
- // DISPLAY();
- // 初始化按鍵庫
- LOAD_TKS_GLOBE_VARIES();
- BS84C12A_LIBV413_INITIAL();
- while(1) {
- _clrwdt1();
- _clrwdt2();
- // TIME_ZHONGDUAN(); // 調(diào)用外部顯示程序,命名為“時間_中斷”
- // BS84C12A_LIBV413();
- //
- // if (SCAN_CYCLEF && ANY_KEY_PRESSF) {
- // GET_KEY_BITMAP();
- //
- // if(DATA_BUF[0] & 0x01) {
- // // Key1
- // num1 = num1 + 1 > 99 ? 1: num1 + 1;
- // beep(100);
- // }
- //
- // if(DATA_BUF[0] & 0x02) {
- // // Key2
- // num1 = num1 - 1 < 0 ? 0: num1 - 1;
- // beep(100);
- // }
- //
- // if(DATA_BUF[0] & 0x04) {
- // // Key3
- // num2 = num2 + 1 > 99 ? 1: num2 + 1;
- // beep(100);
- // }
- //
- // if(DATA_BUF[0] & 0x08) {
- // // Key4
- // num2 = num2 - 1 < 0 ? 0: num2 - 1;
- // beep(100);
- // }
- //
- // // 非常重要,加上后不會連續(xù)觸發(fā)按鍵
- // ANY_KEY_PRESSF = 0;
- // }
- //
- // dispNumber(0, num1);
- // dispNumber(1, num2);
- // DISPLAY();
-
-
-
- if(TKS_250MSF) //觸摸庫函數(shù)提供的時間標志位
- {
-
- // temp++; //250ms加一,為下面的顯示調(diào)用而加
- // dispnum(temp);
- }
-
- }
- }
復(fù)制代碼 以上代碼的工程文件(僅供參考):
lesson_20220915_中斷在C中.zip
(86.69 KB, 下載次數(shù): 7)
2022-12-12 06:57 上傳
點擊文件名下載附件
|