標(biāo)題:
STC8H4K64TLCD-45MHz-LQFP64,硬件LCD段碼驅(qū)動(dòng)顯示程序,硬件實(shí)時(shí)時(shí)鐘演示程序
[打印本頁]
作者:
STC莊偉
時(shí)間:
2022-10-28 09:52
標(biāo)題:
STC8H4K64TLCD-45MHz-LQFP64,硬件LCD段碼驅(qū)動(dòng)顯示程序,硬件實(shí)時(shí)時(shí)鐘演示程序
STC8H4K64TLCD-45MHz-LQFP64
,硬件
LCD
段碼驅(qū)動(dòng)顯示程序,硬件實(shí)時(shí)時(shí)鐘演示程序
11.png
(134.72 KB, 下載次數(shù): 45)
下載附件
2022-10-28 09:51 上傳
單片機(jī)源程序如下:
/*********************************************************/
#define MAIN_Fosc 11059200L //定義主時(shí)鐘
#include "STC8H4K64TL.h"
/************* 功能說明 **************
請(qǐng)先別修改程序, 直接下載"04-RTC基本操作-5位液晶顯示時(shí)間"里的"rtc.hex"測(cè)試, 主頻選擇11.0592MHZ. 測(cè)試正常后再修改移植.
K1切換顯示時(shí)分和分秒。
K2調(diào)整小時(shí)+. 按下超過1秒, 則提供1秒10個(gè)鍵碼.
K3調(diào)整分鐘+. 按下超過1秒, 則提供1秒10個(gè)鍵碼.
K4調(diào)整分鐘-. 按下超過1秒, 則提供1秒10個(gè)鍵碼.
特別提醒: 本例子僅僅是一個(gè)示范程序, 不同的段碼液晶, 其筆段排列不同, 要根據(jù)具體的液晶屏來確定顯存映射.
MCU電流: 根據(jù)LCD面積大約10~25uA.
硬件連接:
COM0---P5.0 SEG8---P0.6 SEG12--P0.4 SEG16--P0.0
COM1---P5.1 SEG9---P0.5 SEG13--P0.3 SEG17--P4.6
COM2---P3.5 SEG10--P5.3 SEG14--P0.2 SEG18--P4.5
COM3---P3.6 SEG11--P5.2 SEG15--P0.1 SEG19--P2.7
LCD顯示內(nèi)容: -日.日.日.日.日
B7 B6 B5 B4 B3 B2 B1 B0
LCD_buff[0]: 2H 3D 1H 2D 左下 1D B1 B0 左下為左下角的箭頭, B0為電池框, B1為電量1
LCD_buff[1]: -- -- -- -- 4H 5D 3H 4D
LCD_buff[2]: 3C 3E 2C 2E 1C 1E B2 右上 右上為右上角的箭頭, B2為電量2
LCD_buff[3]: -- -- -- -- 5C 5E 4C 4E
LCD_buff[4]: 3B 3G 2B 2G 1B 1G B3 - B3為電量3, -為左邊符號(hào)
LCD_buff[5]: -- -- -- -- 5B 5G 4B 4G
LCD_buff[6]: 3A 3F 2A 2F 1A 1F B4 左上 左上為左上角的箭頭
LCD_buff[7]: -- -- -- -- 5A 5F 4A 4F
******************************************/
/************* 本地常量聲明 **************/
#define K_SWITCH 0x10
#define K_HOUR 0x20
#define K_MIN_UP 0x40
#define K_MIN_DN 0x80
#define DIS_BLACK 0x10
#define DIS_ 0x11
#define LCD_SET_BAT0 LCD_buff[0] |= 0x01
#define LCD_CLR_BAT0 LCD_buff[0] &= ~0x01
#define LCD_CPL_BAT0 LCD_buff[0] ^= 0x01
#define LCD_SET_BAT1 LCD_buff[0] |= 0x02
#define LCD_CLR_BAT1 LCD_buff[0] &= ~0x02
#define LCD_CPL_BAT1 LCD_buff[0] ^= 0x02
#define LCD_SET_BAT2 LCD_buff[2] |= 0x02
#define LCD_CLR_BAT2 LCD_buff[2] &= ~0x02
#define LCD_CPL_BAT2 LCD_buff[2] ^= 0x02
#define LCD_SET_BAT3 LCD_buff[4] |= 0x02
#define LCD_CLR_BAT3 LCD_buff[4] &= ~0x02
#define LCD_CPL_BAT3 LCD_buff[4] ^= 0x02
#define LCD_SET_BAT4 LCD_buff[6] |= 0x02
#define LCD_CLR_BAT4 LCD_buff[6] &= ~0x02
#define LCD_CPL_BAT4 LCD_buff[6] ^= 0x02
#define LCD_SET_LEFT_UP LCD_buff[6] |= 0x01
#define LCD_CLR_LEFT_UP LCD_buff[6] &= ~0x01
#define LCD_SET_LEFT_DN LCD_buff[0] |= 0x08
#define LCD_CLR_LEFT_DN LCD_buff[0] &= ~0x08
#define LCD_SET_RIGHT_UP LCD_buff[2] |= 0x01
#define LCD_CLR_RIGHT_UP LCD_buff[2] &= ~0x01
/************* 本地IO定義 **************/
/************* 本地變量聲明 **************/
u8 year, month, day, week, hour, minute, second; //RTC實(shí)時(shí)時(shí)間
bit B_500mS; // 0.5秒時(shí)隙標(biāo)志
bit B_20ms; // 20ms時(shí)隙標(biāo)志
u8 OpTime; // 此變量非0時(shí), 不睡眠, 連續(xù)運(yùn)行程序(本例串口喚醒后連續(xù)運(yùn)行5秒, 以便正確接收串口數(shù)據(jù))
u8 idata LCD_buff[8]; //LCD顯存
u8 DisMode; //顯示模式, 0: 顯示時(shí)分, 1:顯示分秒, 2:顯示月日
u8 KeyState; //鍵狀態(tài)
u8 KeyCode; //鍵碼
u8 KeyHoldCnt; //重鍵計(jì)數(shù)
/************* 本地函數(shù)聲明 **************/
u8 SetRTC(void); //設(shè)置RTC時(shí)間函數(shù)
void RTC_config(void); //RTC初始化函數(shù)
void RTC_read(void); //讀RTC時(shí)間函數(shù)
void RTC_ShowLCD(void); //顯示時(shí)間信息
u8 Timer0_Config(u32 reload); //reload值是主時(shí)鐘周期數(shù)
void LCD_config(void);
void LoadToLcd(void);
void LCD_load(u8 n, u8 dat); //n為第幾個(gè)數(shù)字,為1~5,dat為要顯示的數(shù)字
void ReadKey(void); //50ms call
//========================================================================
// 函數(shù): void main(void)
// 描述: 主函數(shù)
// 參數(shù): none.
// 返回: none.
// 版本: VER1.0
// 日期: 2018-4-2
// 備注:
//========================================================================
void main(void)
{
P0M1 = 0; P0M0 = 0;
P1M1 = 0; P1M0 = 0;
P2M1 = 0; P2M0 = 0;
P3M1 = 0; P3M0 = 0;
P4M1 = 0; P4M0 = 0;
P5M1 = 0; P5M0 = 0;
P6M1 = 0; P6M0 = 0;
P7M1 = 0; P7M0 = 0;
Timer0_Config(MAIN_Fosc / 50); //reload值是主時(shí)鐘周期數(shù), (中斷頻率, 50次/秒)
EA = 1;
OpTime = 0;
DisMode = 0;
RTC_config();
LCD_config();
while (1)
{
if(B_20ms)
{
B_20ms = 0;
ReadKey();
}
if(B_500mS) // 1/2秒中斷
{
B_500mS = 0;
if(second == RTC_SEC) // RTC的秒計(jì)數(shù)值, 相等則秒沒變化, 0.5秒而已, 閃點(diǎn)
{
if(DisMode <= 1) //顯示時(shí)分或分秒才閃秒
{
LCD_load(3, DIS_); //秒閃中間一杠
LoadToLcd();
}
}
else //秒有變化
{
RTC_read();
if(OpTime != 0) OpTime--; //連續(xù)操作時(shí)間
RTC_ShowLCD(); //顯示時(shí)間信息
}
}
if(KeyCode != 0)
{
if(KeyCode == K_SWITCH) //短按K1鍵 切換顯示
{
if(++DisMode >= 3) DisMode = 0; //0: 顯示時(shí)分, 1:顯示分秒, 2:顯示月日
RTC_ShowLCD(); //顯示時(shí)間信息
}
else if(DisMode == 0) //顯示時(shí)分時(shí)可以調(diào)時(shí)間
{
if(KeyCode == K_HOUR) //hour鍵
{
if(++hour >= 24) hour = 0;
SetRTC();
RTC_ShowLCD(); //顯示時(shí)間信息
}
else if(KeyCode == K_MIN_UP) //MINUTE+鍵
{
if(++minute >= 60) minute = 0;
second = 0;
SetRTC();
RTC_ShowLCD(); //顯示時(shí)間信息
}
else if(KeyCode == K_MIN_DN) //MINUTE-鍵
{
if(--minute >= 60) minute = 59;
second = 0;
SetRTC();
RTC_ShowLCD(); //顯示時(shí)間信息
}
}
else if(DisMode == 2) //顯示月日時(shí)可以調(diào)日期
{
if(KeyCode == K_HOUR) //hour鍵
{
if(++month >= 13) month = 1;
SetRTC();
RTC_ShowLCD(); //顯示時(shí)間信息
}
else if(KeyCode == K_MIN_UP) //MINUTE+鍵
{
if(++day >= 32) day = 1;
SetRTC();
RTC_ShowLCD(); //顯示時(shí)間信息
}
else if(KeyCode == K_MIN_DN) //MINUTE-鍵
{
if(--day == 0) day = 31;
SetRTC();
RTC_ShowLCD(); //顯示時(shí)間信息
}
}
KeyCode = 0;
}
if(OpTime != 0) // OpTime!=0進(jìn)入空閑模式
{
PCON |= 0x01; //進(jìn)入空閑模式
NOP(5);
}
else //if(OpTime == 0) // OpTime==0才進(jìn)入掉電模式
{
IE0 = 0; //外中斷0標(biāo)志位
IT0 = 1; //下降沿中斷
EX0 = 1; //允許中斷
P32 = 1; //喚醒腳(也是鍵掃描腳)
P64 = 0; //按鍵輸入
P65 = 0; //按鍵輸入
P66 = 0; //按鍵輸入
P67 = 0; //按鍵輸入
NOP(5);
PCON |= 0x02; //進(jìn)入睡眠模式
NOP(5);
EX0 = 0; //禁止中斷
P32 = 0;
P64 = 1;
P65 = 1;
P66 = 1;
P67 = 1;
NOP(5);
}
}
}
/********************* INT0中斷函數(shù) *************************/
void Ext_INT0 (void) interrupt 0
{
OpTime = 6;
}
void ReadKey(void) //20ms call
{
u8 i;
i = KeyState; KeyState = ~P6 & 0xf0;
i = (i ^ KeyState) & KeyState;
if(i != 0) KeyCode = i; //按下
if(KeyState)
{
OpTime = 6; //有鍵按著
if(++KeyHoldCnt >= 50)
{
KeyHoldCnt = 45;
KeyCode = KeyState & 0xe0;
}
}
else KeyHoldCnt = 0;
}
/********************** 顯示時(shí)間信息 *****************************/
void RTC_ShowLCD(void)
{
if(DisMode == 0) //0: 顯示時(shí)分, 1:顯示分秒, 2:顯示月日
{
if(hour >= 10) LCD_load(1, hour/10);
else LCD_load(1, DIS_BLACK); //消隱
LCD_load(2, hour%10);
LCD_load(3, DIS_BLACK);
LCD_load(4, minute / 10);
LCD_load(5, minute % 10);
}
else if(DisMode == 1) //0: 顯示時(shí)分, 1:顯示分秒, 2:顯示月日
{
LCD_load(1, minute/10);
LCD_load(2, minute%10);
LCD_load(3, DIS_BLACK);
LCD_load(4, second / 10);
LCD_load(5, second % 10);
}
else if(DisMode == 2) //0: 顯示時(shí)分, 1:顯示分秒, 2:顯示月日
{
if(month >= 10) LCD_load(1, month/10);
else LCD_load(1, DIS_BLACK);
LCD_load(2, month%10);
LCD_load(3, DIS_BLACK);
LCD_load(4, day / 10);
LCD_load(5, day % 10);
}
LoadToLcd();
}
/****************** 對(duì)第1~5數(shù)字裝載顯示函數(shù) ***************************/
u8 code t_display[]={ //標(biāo)準(zhǔn)字庫
// 0 1 2 3 4 5 6 7 8 9 A B C D E F
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
//black - H J K L N o P U t G Q r M y
0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e};
u8 code T_LCD_mask[7] = {0x00,0x0C,0x30,0xC0,0x03,0x0C};
u8 code T_LCD_mask7[7] = {0x00,0x04,0x10,0x40,0x01,0x04};
u8 code T_SEG_ABC[7] = {0x00,0x08,0x20,0x80,0x02,0x08};
u8 code T_SEG_DEFG[7] = {0x00,0x04,0x10,0x40,0x01,0x04};
/********************** 裝載顯示5個(gè)8字 *****************************/
void LCD_load(u8 n, u8 dat) //n為第幾個(gè)數(shù)字,為1~5,dat為要顯示的數(shù)字
{
u8 i,k;
if((n == 0) || (n >= 6)) return; //合法值 1~5
dat = t_display[dat];
k = ~T_LCD_mask[n];
if(n <= 3) //1~3
{
LCD_buff[0] &= ~T_LCD_mask7[n];
LCD_buff[2] &= k;
LCD_buff[4] &= k;
LCD_buff[6] &= k;
i = T_SEG_ABC[n];
k = T_SEG_DEFG[n];
if(dat & 0x01) LCD_buff[6] |= i; //T_SEG_ABC[n]; //A
if(dat & 0x02) LCD_buff[4] |= i; //T_SEG_ABC[n]; //B
if(dat & 0x04) LCD_buff[2] |= i; //T_SEG_ABC[n]; //C
if(dat & 0x08) LCD_buff[0] |= k; //T_SEG_DEFG[n]; //D
if(dat & 0x10) LCD_buff[2] |= k; //T_SEG_DEFG[n]; //E
if(dat & 0x20) LCD_buff[6] |= k; //T_SEG_DEFG[n]; //F
if(dat & 0x40) LCD_buff[4] |= k; //T_SEG_DEFG[n]; //G
}
else // n=4 or 5
{
LCD_buff[1] &= ~T_LCD_mask7[n];
LCD_buff[3] &= k;
LCD_buff[5] &= k;
LCD_buff[7] &= k;
i = T_SEG_ABC[n];
k = T_SEG_DEFG[n];
if(dat & 0x01) LCD_buff[7] |= i; //T_SEG_ABC[n]; //A
if(dat & 0x02) LCD_buff[5] |= i; //T_SEG_ABC[n]; //B
if(dat & 0x04) LCD_buff[3] |= i; //T_SEG_ABC[n]; //C
if(dat & 0x08) LCD_buff[1] |= k; //T_SEG_DEFG[n]; //D
if(dat & 0x10) LCD_buff[3] |= k; //T_SEG_DEFG[n]; //E
if(dat & 0x20) LCD_buff[7] |= k; //T_SEG_DEFG[n]; //F
if(dat & 0x40) LCD_buff[5] |= k; //T_SEG_DEFG[n]; //G
}
}
/********************** 將顯示內(nèi)容導(dǎo)入顯存 *****************************/
void LoadToLcd(void)
{
C0SEGV1 = LCD_buff[0]; // C0SEG 15~8數(shù)據(jù)寄存器
C0SEGV2 = LCD_buff[1]; // C0SEG 23~16數(shù)據(jù)寄存器
C1SEGV1 = LCD_buff[2]; // C1SEG 15~8數(shù)據(jù)寄存器
C1SEGV2 = LCD_buff[3]; // C1SEG 23~16數(shù)據(jù)寄存器
C2SEGV1 = LCD_buff[4]; // C2SEG 15~8數(shù)據(jù)寄存器
C2SEGV2 = LCD_buff[5]; // C2SEG 23~16數(shù)據(jù)寄存器
C3SEGV1 = LCD_buff[6]; // C3SEG 15~8數(shù)據(jù)寄存器
C3SEGV2 = LCD_buff[7]; // C3SEG 23~16數(shù)據(jù)寄存器
}
/********************** LCD配置函數(shù) *****************************/
void LCD_config(void)
{
u8 i;
P_SW2 |= 0x80; // SFR enable
LCDCFG = 0x80 + 7; // 0x00:選擇CPU時(shí)鐘為L(zhǎng)CD時(shí)鐘, 0x80: 選擇外部32K晶振做時(shí)鐘. VLCD電壓選擇0~7對(duì)應(yīng)0.65+VLCD*0.05.
DBLEN = 2; // 設(shè)置LCD顯示時(shí)的死區(qū)時(shí)間長(zhǎng)度, 取值0~7.
COMLENH = 0; // COM時(shí)間長(zhǎng)度設(shè)置 高字節(jié)COMLEN[19:16], 一共20bit.
COMLENM = 0; // COM時(shí)間長(zhǎng)度設(shè)置 中字節(jié)COMLEN[15:8] LCD刷新率 = LCD時(shí)鐘頻率 / ((DBLEN[2:0]+COMLEN[19:0]+1) *2 * COM數(shù))
COMLENL = 65; // COM時(shí)間長(zhǎng)度設(shè)置 低字節(jié)COMLEN[7:0] LCD刷新率 = 32768/((2+65+1)*2*4) = 60Hz
BLINKRATE = 60; // 閃爍率配置寄存器, LCD閃爍率 = LCD刷新率 / BLINKRATE[7:0] Hz
COMON = 0x0f; // COM使能寄存器
SEGON1 = 0x00; // SEG線使能寄存器1, SEG7~SEG0
SEGON2 = 0xff; // SEG線使能寄存器2, SEG15~SEG8
SEGON3 = 0x0f; // SEG線使能寄存器3, SEG23~SEG16
SEGON4 = 0x00; // SEG線使能寄存器4, SEG31~SEG24
SEGON5 = 0x00; // SEG線使能寄存器5, SEG39~SEG32
P5n_pure_input(0x03); //P5.0 P5.1 設(shè)置為高阻輸入 COM0 COM1
P3n_pure_input(0x60); //P3.5 P3.6 設(shè)置為高阻輸入 COM2 COM3
LCDCFG2 = 0x0f; // SEG0~3切換到P7.7~7.4
// P7n_pure_input(0xf0); //P7.7~P7.4 設(shè)置為高阻輸入 SEG0~SEG3 (對(duì)應(yīng)P7.7~7.4)
// P4n_pure_input(0x80); //P4.7 設(shè)置為高阻輸入 SEG4
// P1n_pure_input(0x03); //P1.1~P1.0 設(shè)置為高阻輸入 SEG5 SEG6 (對(duì)應(yīng)P1.1 P1.0)
P0n_pure_input(0x60); //P0.7~P0.5 設(shè)置為高阻輸入 SEG7 SEG8 SEG9 (對(duì)應(yīng)P0.7 P0.6 P0.5)
P5n_pure_input(0x0C); //P5.3 P5.2 設(shè)置為高阻輸入 SEG10 SEG11 (對(duì)應(yīng)P5.3 P5.2)
P0n_pure_input(0x1f); //P0.4~P0.0 設(shè)置為高阻輸入 SEG12~SEG16 (對(duì)應(yīng)P0.4 ~ 0.0)
P4n_pure_input(0x60); //P4.6 P4.5 設(shè)置為高阻輸入 SEG17 SEG18
P2n_pure_input(0x80); //P2.7~P2.0 設(shè)置為高阻輸入 SEG19~SEG26 (對(duì)應(yīng)P2.7~2.0)
// P4n_pure_input(0x1e); //P4.4~P4.1 設(shè)置為高阻輸入 SEG27~SEG30 (對(duì)應(yīng)P4.4~4.1)
// P3n_pure_input(0x80); //P3.7 設(shè)置為高阻輸入 SEG31
// P7n_pure_input(0x0f); //P7.3~P7.0 設(shè)置為高阻輸入 SEG32~SEG35 (對(duì)應(yīng)P7.3~7.0)
// P6n_pure_input(0x0f); //P6.0~P6.3 設(shè)置為高阻輸入 SEG36~SEG39 (對(duì)應(yīng)P6.3~6.0)
for(i=0; i<8; i++) LCD_buff[i] = 0x00; //清除顯示內(nèi)容
LoadToLcd(); //將顯示內(nèi)容導(dǎo)入顯存
LCDCR = (0<<1) + 1; // LCD控制寄存器, 0:普通模式, 1:長(zhǎng)暗模式, 2:長(zhǎng)亮模式, 3:閃爍模式. +0:禁止LCD模塊, +1:允許LCD模塊.
}
/********************** 設(shè)置RTC時(shí)間 *****************************/
u8 SetRTC(void)
{
P_SW2 |= 0x80; //SFR enable
if(year > 99) return 1;
if((month == 0) || (month > 12)) return 2;
if((day == 0) || (day > 31)) return 3;
if(hour > 23) return 4;
if(minute > 59) return 5;
if(second > 59) return 6;
INIYEAR = year;
INIMONTH = month;
INIDAY = day;
INIHOUR = hour;
INIMIN = minute;
INISEC = second;
INISSEC = 0;
RTCCFG = 0x01 | 0x00; //設(shè)置RTC時(shí)間, |0x00:選擇外部32K時(shí)鐘, |0x02:選擇內(nèi)部32K時(shí)鐘.
while(RTCCFG & 0x01); //等待初始化完成. 設(shè)置RTC時(shí)間需要32768Hz的1個(gè)周期時(shí)間,大約30.5us. 由于同步, 所以實(shí)際等待時(shí)間是0~30.5us.
//如果不等待設(shè)置完成就睡眠, 則RTC會(huì)由于設(shè)置沒完成, 停止計(jì)數(shù), 喚醒后才繼續(xù)完成設(shè)置并繼續(xù)計(jì)數(shù).
return 0;
}
/********************** RTC配置函數(shù) *****************************/
void RTC_config(void) //RTC初始化函數(shù)
{
P_SW2 |= 0x80; //SFR enable
P1n_pure_input(0xc0); //P1.6 P1.7設(shè)置為高阻輸入
P1IE = ~0xc0; //P1.6 P1.7關(guān)閉數(shù)字輸入功能
X32KCR = 0x80 + 0x40; //啟動(dòng)外部32K晶振, 低增益+0x00, 高增益+0x40.
year = 21;
month = 7;
day = 29;
hour = 12;
minute = 0;
second = 0;
RTCCR = 0x01; //使能RTC, 并開始RTC計(jì)數(shù)
SetRTC(); //設(shè)置RTC時(shí)間
RTCIF = 0; //中斷標(biāo)志, 0x80:鬧鐘中斷, 0x40:日中斷, 0x20:小時(shí)中斷, 0x10:分鐘中斷, 0x08:秒中斷, 0x04:1/2秒中斷, 0x02:1/8秒中斷, 0x01:1/32秒中斷
RTCIEN = 0x04; //中斷使能, 0x80:鬧鐘中斷, 0x40:日中斷, 0x20:小時(shí)中斷, 0x10:分鐘中斷, 0x08:秒中斷, 0x04:1/2秒中斷, 0x02:1/8秒中斷, 0x01:1/32秒中斷
ALAHOUR = 8; //鬧鐘小時(shí)
ALAMIN = 30; //鬧鐘分鐘
ALASEC = 0; //鬧鐘秒
ALASSEC = 0; //鬧鐘1/128秒
}
/********************** 讀取RTC時(shí)間信息 *****************************/
void RTC_read(void)
{
P_SW2 |= 0x80; //SFR enable
year = RTC_YEAR; // RTC的年計(jì)數(shù)值
month = RTC_MONTH; // RTC的月計(jì)數(shù)值
day = RTC_DAY; // RTC的日計(jì)數(shù)值
hour = RTC_HOUR; // RTC的時(shí)計(jì)數(shù)值
minute = RTC_MIN; // RTC的分計(jì)數(shù)值
second = RTC_SEC; // RTC的秒計(jì)數(shù)值
// ssecond = RTC_SSEC; // RTC的1/128秒計(jì)數(shù)值
}
//========================================================================
// 函數(shù):u8 Timer0_Config(u32 reload)
// 描述: timer0初始化函數(shù).
// 參數(shù): reload: 重裝值.
// 返回: 0: 初始化正確, 1: 重裝值過大, 初始化錯(cuò)誤.
// 版本: V1.0, 2018-3-5
//========================================================================
u8 Timer0_Config(u32 reload) //t=0: reload值是主時(shí)鐘周期數(shù), t=1: reload值是時(shí)間(單位us)
{
TR0 = 0; //停止計(jì)數(shù)
if(reload >= (65536UL * 12)) return 1; //值過大, 返回錯(cuò)誤
if(reload < 65536UL) AUXR |= 0x80; //1T mode
else
{
AUXR &= ~0x80; //12T mode
reload = reload / 12;
}
reload = 65536UL - reload;
TH0 = (u8)(reload >> 8);
TL0 = (u8)(reload);
ET0 = 1; //允許中斷
TMOD = (TMOD & ~0x03) | 0; //工作模式, 0: 16位自動(dòng)重裝, 1: 16位定時(shí)/計(jì)數(shù), 2: 8位自動(dòng)重裝, 3: 16位自動(dòng)重裝, 不可屏蔽中斷
TR0 = 1; //開始運(yùn)行
return 0;
}
//========================================================================
// 函數(shù): void timer0_int (void) interrupt TIMER0_VECTOR
// 描述: timer0中斷函數(shù).
// 參數(shù): none.
// 返回: none.
// 版本: V1.0, 2016-5-12
//========================================================================
void timer0_ISR (void) interrupt TIMER0_VECTOR
{
B_20ms = 1; //20ms時(shí)隙標(biāo)志
}
//========================================================================
// 函數(shù): AUXR_ISR(void) interrupt 13
// 描述: 擴(kuò)展中斷函數(shù)(中斷號(hào)>=32的中斷)
// 參數(shù): none.
// 返回: none.
// 版本: VER1.0
// 日期: 2018-4-2
// 備注:
//========================================================================
u8 isr_index;
void AUXR_ISR(void) interrupt 13
{
u8 i;
switch(isr_index)
{
case 32: //0103H 波形發(fā)生器5 中斷入口
//用戶中斷處理代碼
break;
case 33: //010BH 波形發(fā)生器異常2 中斷入口
//用戶中斷處理代碼
break;
case 34: //0113H 波形發(fā)生器異常4 中斷入口
//用戶中斷處理代碼
break;
case 35: //011BH 觸摸按鍵 中斷入口
//用戶中斷處理代碼
break;
case 36: //0123H RTC 中斷入口
i = RTCIF;
RTCIF = 0; //中斷標(biāo)志, 0x80:鬧鐘中斷, 0x40:日中斷, 0x20:小時(shí)中斷, 0x10:分鐘中斷, 0x08:秒中斷, 0x04:1/2秒中斷, 0x02:1/8秒中斷, 0x01:1/32秒中斷
if(i & 0x04) //1/2秒中斷
{
B_500mS = 1;
P33 = ~P33; //輸出2秒周期方波, 方便測(cè)試精度
}
break;
case 37: //012BH P0口中斷入口
//用戶中斷處理代碼
break;
case 38: //0133H P1口中斷入口
//用戶中斷處理代碼
break;
case 39: //013BH P2口中斷入口
//用戶中斷處理代碼
break;
case 40: //0143H P3口中斷入口
//用戶中斷處理代碼
break;
case 41: //014BH P4口中斷入口
//用戶中斷處理代碼
break;
case 42: //0153H P5口中斷入口
//用戶中斷處理代碼
break;
case 43: //015BH P6口中斷入口
//用戶中斷處理代碼
break;
case 44: //0163H P7口中斷入口
//用戶中斷處理代碼
break;
case 45: //016BH P8口中斷入口
//用戶中斷處理代碼
break;
case 46: //0173H P9口中斷入口
//用戶中斷處理代碼
break;
default:
break;
}
}
復(fù)制代碼
Keil代碼下載:
STC8H4K64TLCD-LCD-RTC-Demo-20220810.zip
(131.77 KB, 下載次數(shù): 38)
2022-10-28 09:52 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1