标题:
bs8412c-3单片机学习_中断程序
[打印本页]
作者:
jijifi008800
时间:
2022-12-12 06:58
标题:
bs8412c-3单片机学习_中断程序
bs8412c-3 学习_中断,汇编与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(); // 本来是汇编中的外部定时中断,现有声明为外部程序
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;
/*
* 初始化中断设置
*/
void initial()
{
_tmrc = 0b00010111;
_tmr = 256-(1000*8/128); // 8M 主频
_te = 1; // 使能定时/ 计数器中断
_emi = 1; // 使能总中断
// BEEP
BEEP_PORT_CTRL = 0;
BEEP_PORT = 0;
}
void smginit()
{
//seg口设置为输出
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口设置为输出
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(); //扫描数码管,这里随主循环不定时的扫描,如果程序复杂时间保证不了足够快,
//可能会有闪烁,这样的话,只能开一个时基中断或放进定时器中断里,
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];
}
//将一个字节每一个bit送至相应的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;
}
/*
* 延时函数
*/
void delay(unsigned short ms)
{
unsigned short i, j;
for (i=0; i<ms; ++i) {
for (j=0; j<200; j++) {
_clrwdt1();
_clrwdt2();
}
}
}
/*
* 使用数码管显示数字
* pos 为 0 显示在左侧两个,为 1 显示右侧两个
* temp 为温度的数值
*/
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(); // 调用外部显示程序,命名为“时间_中断”
// 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);
// }
//
// // 非常重要,加上后不会连续触发按键
// ANY_KEY_PRESSF = 0;
// }
//
// dispNumber(0, num1);
// dispNumber(1, num2);
// DISPLAY();
if(TKS_250MSF) //触摸库函数提供的时间标志位
{
// temp++; //250ms加一,为下面的显示调用而加
// dispnum(temp);
}
}
}
复制代码
以上代码的工程文件(仅供参考):
lesson_20220915_中断在C中.zip
(86.69 KB, 下载次数: 7)
2022-12-12 06:57 上传
点击文件名下载附件
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1