
LCD液晶屏秒表程序c语言?谁有?急求!!!!
1个回答
展开全部
//此程序实现计时秒表功能,时钟显示范围00.00~99.99 秒,分辨度:0.01 秒
#include "p18f458.h"
unsigned char s[4]; //定义0.01 秒、0.1 秒、1 秒、10 秒计时器
unsigned char k,data,sreg;
unsigned int i;
const table[11]={0xc0 ,0xf9,0xa4,0xb0,0x99,0x92,0x82,0XD8,0x80,0x90};
//不带小数点的显示段码表
const table0[10]={0X40,0X79,0X24,0X30,0X19,0X12,0X02,0X78,0X00,0X10};
//带小数点的显示段码表
void clkint(void);
//TMR0 初始化子程序
void tmint()
{
T0CON=0XCF; //设定TMR0L 工作于8 位定时器方式
//内部时钟,TMR0不用分频
INTCON=0X20; //总中断禁止,TMR0 中断允许,清除TMR0 的中断标志
INTCON2bits.TMR0IP=1; //TMR0 中断高优先级
RCONbits.IPEN=1; //使能中断优先级
}
//系统其它部分初始化子程序
void initial()
{
TRISA=0x00; //A口设置为输出
TRISB=0XF0; //RB1 输出,RB4 输入
TRISC=0x00; //SDO引脚为输出,SCK 引脚为输出
TRISE=0x00; //E口设置为输出
SSPCON1=0x30; //SSPEN=1;CKP=1,FOSC/4
SSPSTAT=0xC0; //时钟下降沿发送数据
PIR1=0; //清除SSPIF 标志
data=0X00; //待显示的寄存器赋初值
PORTBbits.RB1=0;
PORTAbits.RA3=0;
PORTE=0; //将 K1,K2,K3,K4 四条列线置0
}
//SPI 传输数据子程序
void SPILED(char data)
{
SSPBUF=data; //启动发送
do
{
;
}while(PIR1bits.SSPIF==0);
PIR1bits.SSPIF=0;
}
//显示子程序,显示4 位数
void dispaly()
{
PORTAbits.RA5=0; //准备锁存
for(k=0;k<4;k++)
{
data=s[k];
if(k==2) data=table0[data]; //个位需要显示小数点
else data=table[data];
SPILED(data); //发送显示段码
}
for(k=0;k<4;k++)
{
data=0xFF;
SPILED(data); //连续发送4 个DARK,使显示好看一些
}
PORTAbits.RA5=1; //最后给锁存信号,代表显示任务完成
}
//软件延时子程序
void DELAY()
{
for(i = 3553; --i ;)
continue;
}
//键扫描子程序
void KEYSCAN()
{
while(1)
{
dispaly(); //调用一次显示子程序
while(PORTBbits.RB4==0)
{
DELAY(); //若有键按下,则软件延时
break;
}
if (PORTBbits.RB4==0) break; //若还有键按下,则终止循环扫描,返回
}
}
//等键松开子程序
void keyrelax()
{
while(1)
{
dispaly(); //调用一次显示子程序
if (PORTBbits.RB4==1) break; //为防止按键过于灵敏,每次等键松开才返回
}
}
/* 高优先级中断向量*/
#pragmacode InterruptVectorHigh=0x08
void InterruptVectorHigh (void)
{
_asm
goto clkint //跳到中断程序
_endasm
}
//中断服务程序
#pragmacode
#pragma interrupt clkint
void clkint()
{
TMR0=0X13; //对 TMR0写入一个调整值。因为写入TMR0 后接着的
//两个周期不能增量,中断需要3 个周期的响应时间,
//以及C 语言自动进行现场保护要消耗周期
INTCONbits.T0IF=0; //清除中断标志
sreg=sreg+1; //中断计数器加1
if(sreg==40) //中断次数为40 后,才对S0,S1,S2,S3 操作
{
sreg=0;
s[0]=s[0]+1;
if(s[0]==10)
{
s[0]=0 ;
s[1]=s[1]+1;
if(s[1]==10)
{
s[1]=0 ;
s[2]=s[2]+1;
if(s[2]==10)
{
s[2]=0;
s[3]=s[3]+1;
if(s[3]==10) s[3]=0;
}
}
}
}
}
//主程序
main()
{
tmint(); //TMR0 初始化
initial(); //spi 显示初始化及系统其它部分初始化
INTCONbits.GIE=0; //总中断禁止
while(1)
{
for(k=0;k<4;k++)
{
s[k]=0;
}
sreg=0; //赋显示初值
dispaly(); //调用一次显示子程序
KEYSCAN(); //键扫描,直到开始键按下
keyrelax(); //等键松开
INTCONbits.GIE=1; //总中断允许
KEYSCAN(); //键扫描直到停止键按下,在键扫描时有显示
keyrelax(); //等键松开
INTCONbits.GIE=0; //总中断禁止
KEYSCAN(); //键扫描到清0 键按下,在键扫描时有显示
keyrelax(); //等键松开
}
}
兴宇合电子
#include "p18f458.h"
unsigned char s[4]; //定义0.01 秒、0.1 秒、1 秒、10 秒计时器
unsigned char k,data,sreg;
unsigned int i;
const table[11]={0xc0 ,0xf9,0xa4,0xb0,0x99,0x92,0x82,0XD8,0x80,0x90};
//不带小数点的显示段码表
const table0[10]={0X40,0X79,0X24,0X30,0X19,0X12,0X02,0X78,0X00,0X10};
//带小数点的显示段码表
void clkint(void);
//TMR0 初始化子程序
void tmint()
{
T0CON=0XCF; //设定TMR0L 工作于8 位定时器方式
//内部时钟,TMR0不用分频
INTCON=0X20; //总中断禁止,TMR0 中断允许,清除TMR0 的中断标志
INTCON2bits.TMR0IP=1; //TMR0 中断高优先级
RCONbits.IPEN=1; //使能中断优先级
}
//系统其它部分初始化子程序
void initial()
{
TRISA=0x00; //A口设置为输出
TRISB=0XF0; //RB1 输出,RB4 输入
TRISC=0x00; //SDO引脚为输出,SCK 引脚为输出
TRISE=0x00; //E口设置为输出
SSPCON1=0x30; //SSPEN=1;CKP=1,FOSC/4
SSPSTAT=0xC0; //时钟下降沿发送数据
PIR1=0; //清除SSPIF 标志
data=0X00; //待显示的寄存器赋初值
PORTBbits.RB1=0;
PORTAbits.RA3=0;
PORTE=0; //将 K1,K2,K3,K4 四条列线置0
}
//SPI 传输数据子程序
void SPILED(char data)
{
SSPBUF=data; //启动发送
do
{
;
}while(PIR1bits.SSPIF==0);
PIR1bits.SSPIF=0;
}
//显示子程序,显示4 位数
void dispaly()
{
PORTAbits.RA5=0; //准备锁存
for(k=0;k<4;k++)
{
data=s[k];
if(k==2) data=table0[data]; //个位需要显示小数点
else data=table[data];
SPILED(data); //发送显示段码
}
for(k=0;k<4;k++)
{
data=0xFF;
SPILED(data); //连续发送4 个DARK,使显示好看一些
}
PORTAbits.RA5=1; //最后给锁存信号,代表显示任务完成
}
//软件延时子程序
void DELAY()
{
for(i = 3553; --i ;)
continue;
}
//键扫描子程序
void KEYSCAN()
{
while(1)
{
dispaly(); //调用一次显示子程序
while(PORTBbits.RB4==0)
{
DELAY(); //若有键按下,则软件延时
break;
}
if (PORTBbits.RB4==0) break; //若还有键按下,则终止循环扫描,返回
}
}
//等键松开子程序
void keyrelax()
{
while(1)
{
dispaly(); //调用一次显示子程序
if (PORTBbits.RB4==1) break; //为防止按键过于灵敏,每次等键松开才返回
}
}
/* 高优先级中断向量*/
#pragmacode InterruptVectorHigh=0x08
void InterruptVectorHigh (void)
{
_asm
goto clkint //跳到中断程序
_endasm
}
//中断服务程序
#pragmacode
#pragma interrupt clkint
void clkint()
{
TMR0=0X13; //对 TMR0写入一个调整值。因为写入TMR0 后接着的
//两个周期不能增量,中断需要3 个周期的响应时间,
//以及C 语言自动进行现场保护要消耗周期
INTCONbits.T0IF=0; //清除中断标志
sreg=sreg+1; //中断计数器加1
if(sreg==40) //中断次数为40 后,才对S0,S1,S2,S3 操作
{
sreg=0;
s[0]=s[0]+1;
if(s[0]==10)
{
s[0]=0 ;
s[1]=s[1]+1;
if(s[1]==10)
{
s[1]=0 ;
s[2]=s[2]+1;
if(s[2]==10)
{
s[2]=0;
s[3]=s[3]+1;
if(s[3]==10) s[3]=0;
}
}
}
}
}
//主程序
main()
{
tmint(); //TMR0 初始化
initial(); //spi 显示初始化及系统其它部分初始化
INTCONbits.GIE=0; //总中断禁止
while(1)
{
for(k=0;k<4;k++)
{
s[k]=0;
}
sreg=0; //赋显示初值
dispaly(); //调用一次显示子程序
KEYSCAN(); //键扫描,直到开始键按下
keyrelax(); //等键松开
INTCONbits.GIE=1; //总中断允许
KEYSCAN(); //键扫描直到停止键按下,在键扫描时有显示
keyrelax(); //等键松开
INTCONbits.GIE=0; //总中断禁止
KEYSCAN(); //键扫描到清0 键按下,在键扫描时有显示
keyrelax(); //等键松开
}
}
兴宇合电子
追问
有没有数码管动态显示汇编程序?谢谢。谢谢你上面的程序有空可以多多交流哈

2023-08-24 广告
作为深圳市兴威帆电子技术有限公司的工作人员,我建议选择实时时钟模块时,可以考虑以下几个因素:1. 精度和稳定性:实时时钟模块需要保持高精度和稳定性,以确保系统时间的准确性。2. 兼容性:需要确保实时时钟模块与您的硬件平台和操作系统兼容。3....
点击进入详情页
本回答由深圳市兴威帆电子技术有限公司提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询