老董 发表于 2024-9-17 23:27 STC的工具软件里面有个按键 |
| 想请教一下你的stc单片机是怎么加到软件里的 我的软件里没有这个 |
|
P0M0 = 0x00; P0M1 = 0x00; P1M0 = 0x00; P1M1 = 0x00; P2M0 = 0x00; P2M1 = 0x00; P3M0 = 0x00; P3M1 = 0x00; P5M0 = 0x00; P5M1 = 0x00; 设置有关系吧 |
|
开来就是被系统删除了
|
|
1860774xxxx 发表于 2024-9-11 22:20 可能需要使用代码功能吧 我发的第二行也有括弧的,实际上是没有的 |
xiaobendan001 发表于 2024-9-11 19:49 我也不知道为什么 后面的i看不到 |
IMG_20240911_221824.jpg (643.84 KB, 下载次数: 11)
1860774xxxx 发表于 2024-9-11 19:19 P0=wei_num; //发送段码 P0=wei_num; //发送段码 |
1860774xxxx 发表于 2024-9-11 19:19 P0=wei_num; //发送段码 P2=wei;// 位 这里写漏了 |
qiuqiubuyao 发表于 2024-9-11 08:18 #include <STC89C5xRC.H>//此文件中定义了单片机的一些特殊功能寄存器 typedef unsigned char u8; //无符号字符形数据类型进行声明定义 定义名称u8 所占位数8位 范围0~255 typedef unsigned int u16; //无符号整形数据类型进行声明定义 定义名称u16 所占位数16位 范围0~65535 u8 code ma[11]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //数字"0123456789-" 共阴 u8 code wei[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; //位 第一位开始点亮 0x7f 0111 1111 ......... u8 wei_num[8]; //存储记录数码管8个段码位的值 要发送数字到哪一位的暂存区 u8 shi,fen,miao; //时 分 秒 变量 /*12T 12M晶振 延时函数 Delay_ms(1)时大约1ms*/ void Delay_ms(u16 ms) { u8 t; while(ms--) { for(t = 0; t < 98; t ++); } } /*主函数*/ void main() { u8 i; while(1) { /*数码管显示处理*/ wei_num[7]=ma[shi%100/10]; //显示 时 wei_num[6]=ma[shi%10]; // wei_num[5]=ma[10]; //显示"-" wei_num[4]=ma[fen%100/10]; //显示 分 wei_num[3]=ma[fen%10]; // wei_num[2]=ma[10]; //显示"-" wei_num[1]=ma[miao%100/10]; //显示 秒 wei_num[0]=ma[miao%10]; // for(i=0; i<8; i++) { P0=wei_num; //发送段码 P2=wei; //位 Delay_ms(1); //间隔一段时间扫描 P0=0x00;//消隐 } } } 难道这样还不够明朗吗 加上定时器加上按键就可以了 再说你那按键用while(!xx); 按键按下是会卡死 数码管消灭 |
|
是否需要消隐看IO口并行位宽,51单片机为8位并行IO,段码和位码做不到并行发送,所以需要消影处理(先关闭前一位再打开下一位),是否显示正常以实物验证为准。 用74HC595或273并行锁存发送、FPGA、16位并行IO的单片机驱动 8位8段数码管或8*8点阵不需要消影。 |
|
数码管动态显示程序中没有消隐程序行,在proteus仿真中会出现一些无序的乱码或意想不到的显示错误。 程序中8个数码管的程序段最后都要加上消隐,以第一个数码管为例: 原程序为: P1=b[0]; P0=a[hour/10]; Delay(10); 加上消隐后程序应为(增加一行): P1=b[0]; P0=a[hour/10]; Delay(10); P0=0x00; 另外8个数码管的总延时时间不要超过20ms,所以每一个数码管的延时建议选用1ms-2ms为宜。 |
qiuqiubuyao 发表于 2024-9-11 08:13 时间的操作还有用定时器吧,显示方面还好一些,建议使用专用的显示芯片 |
| 数码管的显示,要遵循先关闭,然后驱动segment,然后驱动com,所有共享segment的管都要先关闭,比如4个数字的,6个数字一起的,全部都先关闭com,最后所有数字配完再开com |
1860774xxxx 发表于 2024-9-10 19:38 感谢回复,虽然刚开始我也觉得用for会更加好,但是因为我的数据是分时分秒来着的,如果单单用for来表示b【i】的位置的话,代码长度也没有办法变短,反而看起来也不够直观,所以就直接这样显示了,或者您会有更好的使用方法。 |
xiaobendan001 发表于 2024-9-10 19:11 感谢回复,我按照您的修改之后显示确实好了,之后秒数的时间又延长了,之后在定时器那里修改之后,时间问题也基本没有了,又或者有没有更好确定时间精度的办法呢 |
| 你的数码管显示代码里根本就没有消影,还有,扫描的间隔/延时太短了 |
qiuqiubuyao 发表于 2024-9-10 11:49 视觉暂留时间,它的长短因人而异,一般在50~200ms。 若数码管为N位,驱动位选的信号频率应大于N*50Hz。 |
| 数码管应该用for循环显示 如: for(i=0;i<8;i++) { |
| 数码管应该用for循环显示 如: for(i=0;i<8;i++) { |
|
在delay(10)之后要换下一位显示之前要先消隐,比如在移位前先把段驱动P0=0; 要么delay(10)要么delay(10000),搞代码不要这极端。你还可以试试比如delay(100); 又或者使用定时器获得更好的效果。 |
| 我后面发现应该是延时的问题,但是当我把延时增加到10000后,屏幕闪烁,这样它的频率在肉眼上就不够快且看着很难受,各位大佬有没有其他更加好的办法呢 |