找回密码
 立即注册
楼主: lijinlei

STC32G12K128和STC8H8K64U驱动四位数码管显示

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:524
  • 最近打卡:2025-05-04 02:13:29

10

主题

1161

回帖

5133

积分

论坛元老

积分
5133
发表于 2024-5-16 13:27:30 | 显示全部楼层
cadp*** 发表于 2024-3-19 09:01
大佬好,有没有16位数码管的驱动例子?8位的参照范例弄成功了,16位的却不行 ...


3个 595,1个驱动数码管段选(a-g,p),2个驱动数码管位选(com1-16) 用扫描方式驱动

094028k44xf9wo2fysw42e.png



  • /****************************************************************
  • * 文件名:code.c
  • * 说  明:Chip=STC89C52; Crystal=12MHz;12T
  • * 功  能:3*74xx595 显示16数码管
  • * 修  订:FreeFish 2019
  • * 版  本:V0.1
  • ****************************************************************/
  • #include<reg52.h>
  • sbit   Dat=P2^0;
  • sbit   RCK=P2^2;
  • sbit   SCK=P2^3;
  • unsigned char index,k;
  • unsigned int  position;
  • unsigned char code table[]={
  •   0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
  • unsigned char Dat_Buf[3];        //要送出的3个字节数据  (段数据-位数据-位数据)
  • unsigned char Dat_Disp[16];        //要显示的16个字符。
  • /****************************************************************
  • * 函数功能:595写入数据
  • ****************************************************************/
  • void write595(unsigned char Data)
  • {
  •   unsigned char i;
  •   for (i=0;i<8;i++)
  •   {
  •     Dat = ((Data & 0x80)==0x80)?1:0;
  •     Data = Data << 1;               
  •     SCK = 1;
  •     SCK = 0;
  •   }
  • }
  • void InitTimer0(void)        //1ms
  • {
  •   TMOD = 0x01;
  •   TH0 = 0x0FC;
  •   TL0 = 0x18;
  •   EA = 1;
  •   ET0 = 1;
  •   TR0 = 1;
  • }
  • /****************************************************************
  • * 函数功能:主函数
  • ****************************************************************/
  • void main()
  • {      
  •   InitTimer0();
  •   Dat_Disp[0]=3;
  •   Dat_Disp[1]=1;
  •   Dat_Disp[2]=4;
  •   Dat_Disp[3]=1;
  •   Dat_Disp[4]=5;
  •   Dat_Disp[5]=9;
  •   Dat_Disp[6]=2;
  •   Dat_Disp[7]=6;
  •   Dat_Disp[8]=5;
  •   Dat_Disp[9]=3;
  •   Dat_Disp[10]=5;
  •   Dat_Disp[11]=8;
  •   Dat_Disp[12]=9;
  •   Dat_Disp[13]=7;
  •   Dat_Disp[14]=9;
  •   Dat_Disp[15]=3;
  •   while(1)
  •   {
  •     if(index==0)
  •       Dat_Buf[0]=table[Dat_Disp[index]]-0x80;//装载段数据
  •     else         
  •       Dat_Buf[0]=table[Dat_Disp[index]];//装载段数据
  •     position=1<<index;
  •     Dat_Buf[1]=position/256;        //位选16-9
  •     Dat_Buf[2]=position%256;        //位选8-1
  •     for (k=0;k<3;k++)
  •     {
  •       write595(Dat_Buf[k]);  //
  •     }
  •     RCK=1;          //更新数据
  •     RCK=0;                //准备下一次
  •     //Delay(10); //点亮一段时间
  •   }
  • }
  • void Timer0Interrupt(void) interrupt 1        //1ms
  • {
  •   TH0 = 0x0FC;
  •   TL0 = 0x18;
  •   //add your code here!
  •   index++;
  •   index=index%16;
  • }






回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:33
  • 最近打卡:2024-07-16 08:38:18

0

主题

24

回帖

296

积分

中级会员

积分
296
发表于 2024-5-17 09:28:03 | 显示全部楼层
angm*** 发表于 2024-5-16 13:27
3个 595,1个驱动数码管段选(a-g,p),2个驱动数码管位选(com1-16) 用扫描方式驱动

非常感谢大佬!
我是TB上买的2块8位数码管,每块有2片595,因为IO不够用,将2块三线串联成16位一起使用,与你的有点区别。
没有编程基础,对位的没有认识,也不会仿真,硬是靠笨办法试,N多次摸索下载实测
已经试验成功,回过头一看,其实跟一块8位数码管一样的驱动,一块的时候发段码-发位码-锁存,
两块串一起的时候,就是发段码-发位码-发段码-发位码-锁存,让4片595都收到数据后锁存
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-4 10:28 , Processed in 0.111879 second(s), 54 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表