找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 512|回复: 10
打印 上一主题 下一主题
收起左侧

STC实验板显示函数谁能帮忙解释一下?

[复制链接]
跳转到指定楼层
楼主
ID:72649 发表于 2023-11-30 05:34 来自手机 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STC实验板这个显示函数看不懂
/********************** 显示扫描函数 ************************/
void DisplayScan(void)
{   
    P7 = ~T_COM[7-display_index];
    P6 = ~t_display[LED8[display_index]];
    if(++display_index >= 8)    display_index = 0;  //8位结束回0
}
这段程序谁能帮忙解释一下?如果位选不在同一个字节的IO口,比如分别用了P1口和P3口,程序要怎样修改?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:277550 发表于 2023-11-30 10:06 | 只看该作者
重新定义位变量,赋值时写单独的语句,
sbit w1 = P1^1;
sbit w2 = P1^2;
sbit w3 = P1^6;
sbit w4 = P3^7;



赋值时,分别
w1=0;
w2=1;
w3=0;
w4=0;

回复

使用道具 举报

板凳
ID:548322 发表于 2023-11-30 11:09 | 只看该作者
直接在头文件把位选 映射到P1 P3端口
回复

使用道具 举报

地板
ID:72649 发表于 2023-11-30 12:47 来自手机 | 只看该作者
devcang 发表于 2023-11-30 10:06
重新定义位变量,赋值时写单独的语句,
sbit w1 = P1^1;
sbit w2 = P1^2;

这样赋值,在上面的函数里面怎么写?
回复

使用道具 举报

5#
ID:72649 发表于 2023-11-30 12:50 来自手机 | 只看该作者
小盼666 发表于 2023-11-30 11:09
直接在头文件把位选 映射到P1 P3端口

如果位选三位,断选有七段,索引又该怎么写?
回复

使用道具 举报

6#
ID:72649 发表于 2023-11-30 13:44 来自手机 | 只看该作者
devcang 发表于 2023-11-30 10:06
重新定义位变量,赋值时写单独的语句,
sbit w1 = P1^1;
sbit w2 = P1^2;

哪这样的映射在函数里面又该怎么写
回复

使用道具 举报

7#
ID:1085085 发表于 2023-11-30 13:48 | 只看该作者
P7做COM口控制,分时输出。P6口做SEG口,显示数字码表。实验箱采样共阳极数码管,所以使用共阴极码表时要进行反相处理。

若楼主还有疑问可以去STCAI官方咨询
回复

使用道具 举报

8#
ID:213173 发表于 2023-11-30 17:47 | 只看该作者
/*
t_display[]     //共阴段码
T_COM[]         //共阴位码
LED8[8]         //显示缓冲
display_index;  //显示位索引
*/
/********************** 显示扫描函数 ************************/
void DisplayScan(void)
{//使用的是共阳数码管,段码、位码都要取反
        P7 = ~T_COM[7-display_index];//位扫描顺序7、6、5、4、3、2、1、0
        P6 = ~t_display[LED8[display_index]];//段码显示内容示范12-30-58
        if(++display_index >= 8)    display_index = 0;  //显示位索引8位结束回0
}

/********************** Timer0 1ms中断函数 ************************/
void timer0 (void) interrupt 1
{
    DisplayScan();  //1ms扫描显示一位
    B_1ms = 1;      //1ms标志
}

任意端口组合驱动数码管.rar (136.94 KB, 下载次数: 5)


回复

使用道具 举报

9#
ID:72649 发表于 2023-12-4 15:36 来自手机 | 只看该作者
STC新未来 发表于 2023-11-30 13:48
P7做COM口控制,分时输出。P6口做SEG口,显示数字码表。实验箱采样共阳极数码管,所以使用共阴极码表时要进 ...

STC官网,只知道截图手册,根本不能回答实质性问题。
回复

使用道具 举报

10#
ID:72649 发表于 2023-12-6 09:43 | 只看该作者
wulin 发表于 2023-11-30 17:47
/*
t_display[]     //共阴段码
T_COM[]         //共阴位码

#include <STC8H.H>

sbit LED0=P2^0;
sbit LED1=P2^1;
sbit LED2=P2^2;
sbit LED3=P2^3;
sbit LED4=P2^4;
sbit LED5=P2^5;
sbit LED6=P2^6;
sbit LED7=P2^7;

sbit wei0=P1^4;
sbit wei1=P1^5;
sbit wei2=P3^3;

unsigned char data table[18]={

        0x03,0x9F,0x25,0x0D,0x99,0x49,0x41,0x1F,
  0x01,0x09,0x11,0xC1,0x63,0x85,0x61,0x71,
        0x00,0x02};           //0000  0000

LED_buf[]={8,8,8};       
unsigned int wnd,Temp1=22,Temp2,Temp3;       
       
void LED_dula(unsigned char dat);
void LED_wela(unsigned char dat);
void Delay_ms(unsigned int t);       
void GPIO_CSH();
void LED_xshi();       
void LED_fuwu();
       
void LED_dula(unsigned char dat)
{
        LED0=dat   &0x01;
        LED1=dat>>1&0x01;
        LED2=dat>>2&0x01;
        LED3=dat>>3&0x01;
        LED4=dat>>4&0x01;
        LED5=dat>>5&0x01;
        LED6=dat>>6&0x01;
        LED7=dat>>7&0x01;
}

void LED_wela(unsigned char dat)
{
        wei0=dat   &0x01;
        wei1=dat>>1&0x01;
        wei2=dat>>2&0x01;
}

void Delay_ms(unsigned int t)
{
        unsigned int i,j;
        for(i=t;i>0;i--)
                for(j=120;j>0;j--);
}

void GPIO_CSH()
{
          P0M0 = 0x00; P0M1 = 0x00;
    P1M0 = 0x00; P1M1 = 0xc0;
    P2M0 = 0x00; P2M1 = 0x00;
    P3M0 = 0x00; P3M1 = 0x00;
    P4M0 = 0x00; P4M1 = 0x00;
    P5M0 = 0x00; P5M1 = 0x00;
    P6M0 = 0x00; P6M1 = 0x00;
    P7M0 = 0x00; P7M1 = 0x00;
}

void LED_xshi()
{
          unsigned int i;
        switch (i)
  {
          case0:
                LED_wela(LED_buf[0]);//送位码       
          LED_dula(0);               //送段码       
          Delay_ms(1);       
                LED_wela(0x00);                        //位消隐       
                i++;
          break;
               
          case1:
                LED_wela(LED_buf[1]);//送位码
          LED_dula(1);         //送段码          
          Delay_ms(1);       
                LED_wela(0x00);                        //位消隐       
                i++;               
          break;
               
          case2:
                LED_wela(LED_buf[2]);//送位码
          LED_dula(2);               //送段码       
          Delay_ms(1);       
                LED_wela(0x00);                        //位消隐       
                i=0;
          break;               
               
          default:
          break;
  }

}

void LED_fuwu()
{
unsigned int i;
        switch (wnd)
  {
          case0:
                LED_buf[0]=18;
                LED_buf[1]=Temp1/10;
                LED_buf[2]=Temp1%10;
                for(i=0;i<5000;i++)
    {
                        LED_xshi();
    }
          break;
               
          case1:
                LED_buf[0]=18;
                LED_buf[1]=Temp2/10;
                LED_buf[2]=Temp2%10;
                for(i=0;i<5000;i++)       
    {
                        LED_xshi();
    }               
          break;       

          case2:
                LED_buf[0]=18;
                LED_buf[1]=Temp3/10;
                LED_buf[2]=Temp3%10;
                for(i=0;i<5000;i++)       
    {
                        LED_xshi();
    }               
          break;       
               
          default:
                  break;
  }

}

void main()
{
        unsigned int i;
        GPIO_CSH();
        for(i=0;i<5000;i++)       
    {
                        LED_xshi();
    }       
        while (1)
        {
   LED_fuwu();
        }
}

这个为什么不能显示?
回复

使用道具 举报

11#
ID:161164 发表于 2023-12-7 09:45 | 只看该作者
hjx5548 发表于 2023-11-30 12:50
如果位选三位,断选有七段,索引又该怎么写?

假设:
P11是位1
P32是位2
P17是位3
  1. sbit P11 = P1^1;
  2. sbit P32 = P3^2;
  3. sbit P17 = P1^7;
  4. void DigiOut(uchar dat)
  5. {
  6.         if(dat & 0x01)
  7.         {
  8.                 P11 = 1;
  9.         }
  10.         else
  11.         {
  12.                 P11 = 0;
  13.         }
  14.         if(dat & 0x02)
  15.         {
  16.                 P32 = 1;
  17.         }
  18.         else
  19.         {
  20.                 P32 = 0;
  21.         }
  22.         if(dat & 0x04)
  23.         {
  24.                 P17 = 1;
  25.         }
  26.         else
  27.         {
  28.                 P17 = 0;
  29.         }
  30. }
  31. void DisplayScan(void)
  32. {   
  33.     DigiOut(~T_COM[7-display_index]);
  34.     P6 = ~t_display[LED8[display_index]];
  35.     if(++display_index >= 3)    display_index = 0;  //8位结束回0
  36. }
复制代码
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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