LED 매트릭스 구성표. LED 매트릭스

최근 몇 년 동안 LED 매트릭스는 옥외 광고 및 다양한 안내판에 널리 보급되었습니다. 매우 밝고 역동적입니다. 그들은 완벽하게 관심을 끌고 맑은 날에는 눈이 멀지 않습니다. 여러분 각자는 매일 도시의 거리에서 그들을 봅니다.
물론 저렴한 가격 (중국 제조업체로 인해)과 화면 조립 용이성으로 인해 유통이 촉진되었습니다.

그러나 마이크로컨트롤러의 장치에서 이러한 매트릭스를 사용하려고 하면 어떻게 될까요? 이러한 매트릭스의 교환 인터페이스 및 출력 논리는 무엇입니까?
모든 것을 알아 내려고합시다.

중국인은 크기와 해상도가 다른 매트릭스 자체와 다양한 간단한 효과로 이미지를 표시하는 컨트롤러와 필요한 모든 액세서리, 연결 케이블, 프레임을 제공합니다.
매트릭스는 단색(흰색, 노란색, 빨간색, 녹색, 파란색) 및 3색(RGB)으로 표시됩니다. 매트릭스 모델의 지정은 일반적으로 Pxx 또는 PHxx와 같으며 여기서 xx는 밀리미터 단위로 픽셀 사이의 거리를 나타내는 숫자입니다. 제 경우에는 P10입니다. 또한 일부 표준 크기의 행렬은 직사각형일 뿐만 아니라 정사각형이기도 합니다.

다이 크기에 대한 가능한 옵션



따라서 크기가 320x160mm이고 픽셀 간 거리가 10mm인 32x16 픽셀의 흰색 매트릭스가 있습니다. 자세히 살펴보겠습니다.
전면보기:

LED가 일종의 타원형 인 것 같았습니까? 당신은 생각하지 않았다 ...


LED 위에 작은 바이저가 만들어져 햇빛이 LED를 비추는 것을 방지합니다.

플라스틱 마스크를 제거한 정면도



우리는 매트릭스를 돌리고 보드를 봅니다.


보드에는 많은 논리 칩이 있습니다. 이 미세 회로가 무엇인지 봅시다.
1. 1 x SM74HC245D - 비반전 버퍼
2. 1 x SM74HC04 - 6채널 인버터
3. 1 x SM74HC138D - 8비트 디코더
4. 4 x APM4953 - 2개의 P 채널 MOSFET 조립
5. 16 x 74HC595D 래치 시프트 레지스터
2개의 16핀 커넥터는 인터페이스이며 그 중 하나는 입력(스크린 컨트롤러가 연결됨)이고 두 번째는 출력(체인의 다음 매트릭스가 연결됨)입니다. 보드의 화살표는 입력 커넥터에서 출력으로 향합니다.
보드 중앙에 있는 단자에 전원이 공급됩니다. 공급 전압 - 5V, 최대 전류(모든 LED 매트릭스가 켜져 있을 때) - 2A(화이트 매트릭스의 경우).

위의 모든 정보와 아래 비디오의 매트릭스 데모. 여기에서 13:04부터 15:00까지 매트릭스 수에 대한 화면 밝기의 의존성에 대해 이야기합니다. 이것은 알고리즘의 오류 때문입니다. 버그가 수정되어 이제 화면이 꺼지기 전에 데이터가 로드됩니다.

저도 반갑습니다 내 유튜브 채널, 저는 여전히 많은 것을 마이크로컨트롤러에 연결합니다.

관심을 가져 주셔서 감사합니다!

LED의 장점은 부인할 수 없으며 오늘날 시계를 포함하여 어디에나 있습니다. LED 매트릭스의 시계는 무엇이며 기사의 장단점을 분석합니다. 이 기사의 끝 부분에는 손으로 장치를 만드는 방법에 대한 자세한 단계별 가이드가 나와 있습니다.

이게 뭐야

LED 매트릭스 시계는 표시를 위해 여러 LED의 매트릭스를 사용하는 전자 시계입니다. 다른 유형의 지표를 사용하는 것이 유일한 차이점입니다.

매트릭스는 단일 양극 또는 음극이 있는 그리드에 함께 조립된 LED 세트입니다. 일반적으로 이러한 지표의 해상도(수직 및 수평 점 수)는 8×8입니다.

그러한 시계가 인기를 얻는 이유, 장점:

  1. 가격. LED 매트릭스는 비슷한 크기의 7세그먼트 표시기보다 저렴합니다.
  2. 명도. LED는 7세그먼트 디스플레이보다 더 밝고 햇볕이 잘 드는 장소에서 더 잘 보입니다. 많은 제조업체는 또한 태양에 노출되지 않도록 다이오드를 건설적으로 보호합니다.
  3. 기능. LED 매트릭스를 사용하여 숫자뿐만 아니라 다양한 문자, 문장 부호, 기호를 표시할 수 있습니다. 일련의 LED 매트릭스를 사용하여 크리핑 라인 형태로 일부 정보를 표시할 수 있습니다.

LED 매트릭스에는 다음과 같은 단점도 있습니다.

  • 제어 복잡성 증가. 요소 수가 많기 때문에(표준 행렬에는 64개가 있음) 7 세그먼트보다 행렬 표시기를 제어하기가 더 쉽습니다. 이를 위해 마이크로컨트롤러, 동적 표시 및 시프트 레지스터가 사용됩니다.
  • 시야각. LED의 특성은 빛을 한 방향으로 집중시키는 것입니다. 이것은 LED 매트릭스의 이미지가 특정 각도에서만 잘 보일 수 있다는 사실로 이어집니다.
  • 고온에 대한 편협함. 열은 LED의 효율성을 감소시키고 수명을 단축시킵니다.
  • 개별 LED의 소손은 "깨진 픽셀"의 효과와 이미지 품질 저하로 이어집니다.

LED 매트릭스의 수제 시계

LED 매트릭스 시계의 큰 인기에도 불구하고 RuNet에서 독립적으로 생산할 계획은 그리 많지 않습니다. 가장 인기있는 것을 고려해 봅시다.

장치 조립에 필요한 기술:

  • 인쇄 회로 기판 생산;
  • 납땜 요소: 구성표는 SMD 실행을 가정합니다. 즉, 요소가 보드 표면에 직접 설치됨을 의미합니다.
  • 마이크로컨트롤러의 펌웨어: MK ATMega16A가 회로에 사용됩니다.
  • MK 프로그래밍: 컨트롤러 펌웨어가 이미 이 장치에 사용 가능하므로 필요하지 않습니다. 이 기술은 예를 들어 온도 또는 습도 센서와 같은 추가 요소를 추가하여 시계의 작동 모드를 변경하거나 기능을 확장하려는 경우에 유용합니다.

필요한 도구:

  • 보드 제작 세트;
  • MK 프로그래머;
  • 납땜 인두.

장치 다이어그램을 자세히 살펴 보겠습니다. 주요 제어 요소는 MK ATMega16A이며 장치의 다음 기능을 제공합니다.

  1. 카운트다운과 달력. 전원이 꺼져도 실행됩니다.
  2. 경보. 여기에는 9개가 있으며 요일에 작동하도록 프로그래밍할 수 있습니다.
  3. 온도 측정. 시계 디자인을 통해 실내와 거리에서 측정을 위해 두 개의 온도 센서를 설치할 수 있습니다.
  4. 라인 모드를 실행합니다. 다음 정보를 제공합니다: 요일, 월, 연도, 온도.
  5. 시계 수정.

대부분의 기능은 마이크로 컨트롤러에 할당되어 회로를 최대한 언로드하고 최소한의 요소를 사용할 수 있습니다.

이 장치는 마이크로 컨트롤러와 TPIC6B595 시프트 레지스터라는 두 개의 마이크로 회로만 사용하며 두 개의 DS18B20 온도 센서(하나는 실외, 다른 하나는 실내)를 연결할 수도 있습니다.

3개의 8×8 LED 매트릭스가 표시에 사용됩니다. 다이오드 D1은 Schottky 다이오드를 사용하는 것이 좋습니다. 회로의 다이오드는 비상 전원으로의 전환을 보장하며 Schottky 다이오드는 전압 강하가 가장 낮고 스위칭 속도가 빠릅니다.

제조 공정:


ATMega 16A를 사용하여 LED 매트릭스에 시계를 조립할 때의 일부 기능은 다음 비디오에서 사용할 수 있습니다.

LED 매트릭스의 시계는 표시 유형이 다른 장치에 비해 많은 장점이 있습니다. 저렴하고 태양에 비추지 않으며 더 많은 정보를 표시하는 데 사용할 수 있습니다. LED 매트릭스에는 많은 시계 모델이 있으며 모든 사람이 필요한 기능을 갖춘 장치를 찾을 수 있습니다. 또한 이러한 시계는 위의 단계별 가이드에서 본 것처럼 특별한 도구나 특별한 기술이 필요하지 않기 때문에 쉽게 만들 수 있습니다.

!
오늘 우리는 어드레서블 LED 매트릭스를 재미있게 다룰 것입니다. 이 프로젝트는 매우 복잡하지만 동시에 누구나 반복할 수 있습니다. 이 프로젝트의 저자는 AlexGyver입니다.

주소 지정이 가능한 LED 스트립은 3색 LED로 구성되며 각 LED에는 특수 미세 회로가 있습니다.


LED의 미세 회로는 서로 정보를 전송합니다. 이를 통해 16,000,000가지 색상 및 음영 중 하나로 테이프의 모든 LED를 켤 수 있습니다. 그리고 가장 멋진 점은 모든 것이 하나의 와이어로 제어된다는 것입니다. 우리는 매우 흥미로운 시대에 살고 있습니다.
테이프는 arduino 플랫폼과 같은 마이크로컨트롤러에 의해 제어됩니다.


그러한 무리 자체는 매우 흥미롭고 불꽃 효과 만 가치가있는 디자인이나 수제 제품에서 많은 응용 프로그램을 찾을 수 있습니다. 그러나 오늘 우리는 그것에 대해 이야기하지 않을 것입니다. 테이프를 지그재그로 놓고 LED가 고르고 규칙적인 격자를 형성하도록 놓으면 어떻게 됩니까? 맞습니다, LED 매트릭스입니다. 편의를 위해 중국에서 기성품 매트릭스를 구입할 수 있으며 가장 흥미로운 점은 테이프를 구입하고 조각을 자르고 와이어로 연결하는 데 몇 시간을 소비하는 것보다 훨씬 저렴하다는 것입니다.




예를 들어 가장 저렴한 8X8 매트릭스가 있으며 누군가가 가지고 놀기가 더 쉬울 것입니다.


오늘 프로젝트의 특징은 다양성과 다양성입니다. 즉, 기성품 매트릭스를 구입할 수 있지만 말하자면 작지만 LED 밀도가 낮은 스트립을 구입하고 매트릭스를 만들 수도 있습니다. 예를 들어 사진과 함께. 이것은 멋질 것입니다.
매트릭스는 다양한 픽셀 효과 생성, 사진 및 gif(gif) 표시, 고전 게임 및 기타 흥미로운 것들을 생성할 수 있는 좋은 기회를 제공합니다. 프로젝트 페이지를 방문하면 필요한 모든 링크, 펌웨어, 다이어그램 및 추가 지침을 찾을 수 있습니다.
따라서 매트릭스 제어 도구로 무장하면 좌표에 따라 모든 LED를 켤 수 있습니다.


훌륭합니다. 모든 종류의 멋진 효과를 낼 수 있습니다. 블루투스를 통해 스마트폰에서 제어할 수 있습니다. 즉, 스마트폰은 블루투스를 통해 몇 가지 명령을 보내고 모듈은 이를 수신하여 아두이노로 전송합니다. 그리고 arduino는 차례로 데이터를 매트릭스로 출력합니다.




저자는 그리기 도구를 만들기로 결정했습니다. 즉, 색상을 선택하고 매트릭스의 모든 LED를 켤 수 있습니다.


첫 번째 단계는 arduino와 통신 프로토콜을 개발하는 것이 었습니다.


첫 번째 숫자는 모드이고 나머지는 다양한 설정 및 기타 전송 값을 담당합니다. 그런 다음 저자는 그리드를 그린 그래픽 필드를 만들었습니다.

프로그램은 손가락으로 필드를 터치한 좌표를 추적하고 이 위치에 임의의 색상으로 사각형을 그립니다. 그 과정에서 사각형의 좌표가 arduino로 전송됩니다.

제조를 위해서는 다음이 필요합니다.
1) 주소 지정이 가능한 LED의 매트릭스 또는 테이프
2) 아두이노;
3) 블루투스 모듈;
4) 저항기.


중국인에게서 파운드를 사거나 라디오 가게에서 살 수 있습니다. 매우 간단한 구성표에 따라 구성 요소를 연결합니다.


브레드보드에 모든 것을 모을 수 있습니다. 그런 다음 프로젝트 페이지에서 프로젝트와 함께 아카이브를 다운로드하고 지침에 따라 라이브러리를 설치한 다음 펌웨어 파일을 엽니다.




여기에 설정이 있습니다. 매트릭스의 크기, 유형 및 연결 지점을 지정합니다.

큰 매트릭스를 직접 만드는 경우, 즉 테이프 조각에서 납땜하는 경우 선택할 수 있는 두 가지 유형이 있습니다.


저자는 납땜이 더 쉽기 때문에 올바른 옵션을 선택하라고 조언합니다. 이제 매트릭스의 시작 부분, 즉 매트릭스에 대한 연결 지점과 첫 번째 테이프 조각의 방향을 결정해야 합니다. 이 치트 시트는 매트릭스 위치에 대한 8가지 옵션 모두에 도움이 됩니다.


저자는 이 펌웨어에 엄청난 시간을 할애했습니다. 이것은 코드 양으로 볼 때 저자의 가장 큰 프로젝트입니다. Arduino는 nevpihuemoe라고 말하는 것처럼 눈알에 꽉 차 있습니다.


따라서 설정하고 클릭하여 펌웨어를 다운로드하십시오. 다운로드하기 전에 rx 핀에서 블루투스를 분리해야 합니다. 그렇지 않으면 arduino가 깜박이지 않습니다. 편의상 와이어에 스위치를 납땜할 수도 있습니다.


다음으로 안드로이드 스마트폰에 GyverMatrixBT 애플리케이션을 설치합니다. 이 응용 프로그램은 Play Market에서 사용할 수 있으며 완전히 무료이며 광고가 없습니다.


그런 다음 블루투스 모듈(암호 1234 또는 0000)과 페어링하고 애플리케이션의 모듈에 연결하면 됩니다. 설정에서 자신과 일치하는 매트릭스의 밝기와 크기는 물론 일부 다른 매개변수를 조정할 수 있습니다.

조정된 크기에 따라 도면 탭에 필드가 생깁니다. 초기화하려면 클릭하세요. 여기에서 탭과 스와이프로 그릴 수 있고, 지울 수 있으며, 필드를 지우고 색상으로 채울 수 있습니다.




일반적으로 현재 우리는 데이터를 매트릭스로 보내는 작업 도구를 가지고 있습니다. 계속 진행할 수 있습니다. 이 전체 시스템은 테이프 또는 모듈의 대형 매트릭스를 구축하기 위해 작성자에 의해 고안되었습니다. 그것은 프로젝트로서, 취미로서 흥미롭고, 누군가는 그것이 광고 목적, 장식 또는 디자인, 음, 또는 단지 재미를 위해 유용하다고 생각할 수 있습니다.

그러나이 형식의 매트릭스는 픽셀 화되지 않고 8 비트가 아닌 그다지 멋져 보이지 않습니다. 각 LED가 자체 정사각형 픽셀을 형성하고 그 위에 디퓨저를 배치하도록 그리드를 만드는 것이 필수적입니다. 그러면 모든 것이 매우 멋질 것입니다. 격자는 형태와 판금의 모든 재료로 만들 수 있습니다. 골판지, 소비에트 나무 통치자 팩 또는 플라스틱 옵션 (PVC 코너) 일 수 있으며 플라스틱 패널과 다양한 제품이있는 건축 자재 상점에서 구입할 수 있습니다. 모서리는 세로로 부러지고 가운데를 자르고 격자를 조립할 수 있습니다. 이것은 판지 다음으로 가장 "집단 농장" 옵션입니다.

물론 긴장을 풀고 격자를 3D 프린터로 인쇄할 수도 있습니다. 그렇게 합시다.






따라서 매트릭스 본문이 인쇄됩니다. 그건 그렇고, 저자는 검정색이 최선의 선택이 아니라고 믿으며 빛을 반사하도록 격자를 흰색으로 인쇄하는 것이 좋습니다. 글쎄, 상관 없어, 우리는 그것을 칠할 것이다.


사실, 여기에 그리드가 없는 매트릭스, LED가 있습니다.


창살을 넣으면 더 날카로워집니다. 이것은 우리가 비스듬히 바라보기 때문입니다.


이제 종이 형태의 디퓨저를 추가하면 어떤 일이 발생하는지 살펴보십시오.


그러나 다른 디스플레이와 마찬가지로 매트릭스는 rgb 색상 공간에서 작동하며 보다 정확한 색상 인식을 위해 배경이 검은색이어야 합니다. 저자는 몇 가지 옵션을 시도하고 영화를 결정했습니다.

때때로 정보를 표시하기 위해 동적 표시가 사용되는 동안 여러 개의 7 세그먼트 표시기 또는 LED 매트릭스를 마이크로 컨트롤러에 연결해야 합니다. 동적 표시의 본질은 지표에 정보를 연속적으로 표시하는 것입니다. 아래 다이어그램은 동적 표시를 구현하기 위해 여러 개의 7 세그먼트 표시기(예: 공통 음극)를 연결하는 예를 보여줍니다. 일반적으로 포인트를 고려하면 8개의 세그먼트가 얻어지지만 구식 방식에서는 그렇게 불렀다. 저항을 통해 마이크로 컨트롤러에 연결된 총 8개의 라인에 대해 동일한 이름 세그먼트의 모든 결론(양극)이 함께 연결됩니다. 각 표시기의 공통 음극은 트랜지스터를 통해 마이크로 컨트롤러에 연결됩니다.


표시 알고리즘은 다음과 같습니다. 먼저 첫 번째 표시기(왼쪽에서 오른쪽으로 표시)에서 켜야 하는 세그먼트에 따라 라인에 필요한 논리 레벨을 설정합니다. 세그먼트를 끕니다. 다음으로 트랜지스터 VT1의베이스에 높은 논리 레벨을 적용하여 첫 번째 표시기의 공통 음극이 공통 와이어에 연결되고 현재 논리 단위가있는 양극에서 해당 세그먼트가 켜집니다. 일정 시간 (일시 중지) 후 트랜지스터베이스에 낮은 논리 레벨을 적용하여 표시기를 끈 다음 두 번째 표시기로 의도 된 출력 정보에 따라 라인의 논리 레벨을 다시 변경하고 트랜지스터 VT2에 신호를 켭니다. 따라서 순환주기에서 순서대로 모든 표시기를 전환합니다. 이것이 전체 동적 표시입니다.

깜빡임 없이 단단한 영상을 얻으려면 스위칭을 고속으로 해야 하고, LED의 깜빡임을 방지하려면 주사율을 70Hz 이상부터 설정해야 하는데, 저는 보통 100Hz로 설정합니다. 위의 구성에서 일시 중지는 다음과 같이 계산됩니다. 주파수 100Hz의 경우 기간은 10ms이고 표시기는 각각 4개이며 각 표시기의 글로우 시간은 10/4 = 2.5ms로 설정됩니다. 하나의 하우징에는 동일한 이름의 세그먼트가 하우징 자체 내부에 연결되어 있는 다중 숫자 7 세그먼트 표시기가 있습니다. 물론 이를 사용하려면 동적 표시를 사용해야 합니다.

동적 표시를 구현하려면 타이머 중 하나의 오버플로에 대한 인터럽트를 사용해야 합니다. 아래는 TMR0 타이머를 사용하는 코드입니다.

;4개의 7세그먼트 지표에 대한 동적 표시 구현 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; swapf 상태,W ; clrf 상태 ; movwf STATUS_TEMP ; ; bcf ind1 ;첫 번째 표시기 끄기 bcf ind2 ;두 번째 표시기 끄기 bcf ind3 ;세 번째 표시기 끄기 bcf ind4 ;네 번째 표시기 끄기; incf shet,F ;증가 레지스터 shet movlw .5 ;등록 내용 확인 shet xorwf shet,W ;5와 같은지 확인 btfss STATUS,Z ; goto met1 ;shet 레지스터의 숫자는 5 movlw와 같지 않습니다.1 ;shet 레지스터의 숫자는 5입니다: 숫자 1 movwf shet를 씁니다. shet 레지스터에 ; met1 movlw .1 ;등록 내용 확인 shet xorwf shet,W ;숫자 1과 같음 btfss STATUS,Z ; goto met2 ;shet 레지스터의 숫자가 1과 같지 않음: met2로 점프 movf datind1,W ;shet 레지스터의 숫자가 1과 같음: movwf PORTB 복사 ;datind1의 내용을 PORTB 레지스터에 등록 bsf ind1 ;첫 번째 표시기 켜기 met2 movlw .2 ;레지스터의 내용 확인 shet xorwf shet,W ;2와 동일 btfss STATUS,Z ; goto met3 ;shet 레지스터의 번호가 2가 아님: met3으로 점프 movf datind2,W ;shet 레지스터의 번호가 2임: movwf PORTB 복사 ;datind2의 내용을 PORTB 레지스터에 등록 bsf ind2 ;두 번째 표시기 켜기 종료로 이동 ;다음으로 점프 레이블 exxit met3 movlw .3 ;등록 내용 확인 shet xorwf shet,W ;3과 같음 btfss STATUS,Z ; goto met4 ;shet 레지스터의 번호가 3이 아님: met4로 점프 movf datind3,W ;shet 레지스터의 번호가 3임: movwf PORTB 복사 ;datind3의 내용을 PORTB 레지스터에 등록 bsf ind3 ;세 번째 표시기 켜기 종료로 이동 ;다음으로 점프 label exxit met4 movf datind4,W ;datind3 레지스터 movwf PORTB의 내용을 PORTB 레지스터로 복사 bsf ind4 ;4번째 표시기를 켭니다. movlw .100 ;타이머 레지스터 TMR0에 156 쓰기 movwf TMR0 ; ; movwf 상태 ; 스왑프 W_TEMP,F ; 스왑프 W_TEMP,W ; ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;메인 프로그램 ................. movlw b"11010011" ;OPTION_REG, 이로써 내부 설정 ;프리스케일러 비율 1:16 설정 ; clrf shet ; 시작하기 전에 레지스터 shet 재설정; 오버플로우 TMR0에서 인터럽트 수행; clrf datind1 ;정보를 clrf datind2로 출력하기 위한 레지스터 지우기 ;표시기, 공통 clrf datind4 ;음극이 있는 표시기로 clrf datind3 ;표시기를 끄는 것과 같습니다. bcf INTCON,T0IF ;TMR0 오버플로 인터럽트 플래그 지우기 bsf INTCON,T0IE ;TMR0 오버플로 인터럽트 활성화 bsf INTCON,GIE ;글로벌 인터럽트 활성화; movlw b"00000110" ;13.52 출력 예 movwf datind1 ; movlw b"11001111" ; movwf dated2 ; movlw b"01101101" ; movwf dated3 ; movlwb"01011011" ; movwf dated4 ; ; . ................; ...; ...; ; end ; 전체 프로그램의 끝;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;4개의 7세그먼트 지표에 대한 동적 표시 구현

;예제 클록 주파수 4MHz, 머신 사이클 1µs

org 0000h ;주소 0000h에서 프로그램 실행 시작

시작으로 이동 ;레이블 시작으로 이동

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;인터럽트 루틴

org 0004h ;주소 0004h에서 서브루틴 실행 시작

movwf W_TEMP ;키 레지스터 값 저장

swapf 상태,W ;

movwf STATUS_TEMP ;

bcf ind1 ;첫 번째 표시기 끄기

bcf ind2 ;두 번째 표시기 끄기

bcf ind3 ;세 번째 표시기 끄기

bcf ind4 ;네 번째 표시기 끄기

incf shet,F ;증가 레지스터 shet

movlw .5 ; 레지스터 shet의 내용 확인

xorwf shet,W ; 5

btfss 상태,Z ;

goto met1; 레지스터 she의 숫자가 5와 같지 않습니다.

movlw .1 ;shet 레지스터의 번호는 5: 번호 1 쓰기

movwf shet; shet 등록

met1 movlw .1 ; shet 레지스터의 내용 확인

xorwf shet,W ; 숫자 1과 같음

btfss 상태,Z ;

goto met2 ;she 레지스터의 숫자가 1이 아님: met2로 점프

movf datind1,W ;shet 레지스터의 숫자는 1: 복사

movwf PORTB ; datind1 레지스터의 내용을 PORTB 레지스터로

bsf ind1 ;첫 번째 표시기 켜기

goto 종료 ;레이블 종료로 이동

met2 movlw .2 ; shet 레지스터의 내용 확인

xorwf shet,W ; 숫자 2와 같음

btfss 상태,Z ;

goto met3 ;she 레지스터의 숫자가 2와 같지 않음: met3으로 점프

movf datind2,W ;shet 레지스터의 숫자는 2: 복사

movwf PORTB ; datind2 레지스터의 내용을 PORTB 레지스터로

bsf ind2 ;두 번째 표시기 켜기

goto 종료 ;레이블 종료로 이동

met3 movlw .3 ; shet 레지스터의 내용 확인

xorwf shet,W ; 숫자 3과 같음

btfss 상태,Z ;

goto met4 ;she 레지스터의 숫자가 3이 아님: met4로 점프

movf datind3,W ;shet 레지스터의 숫자는 3: 복사

movwf PORTB ;datind3 레지스터의 내용을 PORTB 레지스터로

bsf ind3 ;세 번째 표시기 켜기

goto 종료 ;레이블 종료로 이동

met4 movf datind4,W ; datind3 레지스터의 내용 복사

movwf PORTB ;PORTB 레지스터로

bsf ind4 ;네 번째 표시기를 켭니다.

exxit bcf INTCON,T0IF ;TMR0 오버플로 인터럽트 플래그 재설정

movlw .100 ;타이머 레지스터 TMR0에 숫자 156 쓰기

swapf STATUS_TEMP,W ; 키 레지스터의 내용 복원

스왑프 W_TEMP,F ;

스왑프 W_TEMP,W ;

retfie ; 종료 인터럽트 루틴

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;메인 프로그램

시작 .................. ;레지스터의 초기 설정

................. ;특수 목적

.................

bsf STATUS,RP0 ;레지스터에 이진수 11010011 쓰기

movlw b"11010011" ;OPTION_REG, 내부 설정

movwf OPTION_REG ; TMR0용 클럭 소스

bcf STATUS,RP0 ;TMR0 이전에 프리스케일러 활성화

;프리스케일러 비율을 1:16으로 설정

clrf shet ; 시작하기 전에 shet 레지스터를 재설정합니다.

;오버플로 인터럽트 TMR0, 수행됨

;전원을 켠 후 한 번

clrf datind1 ; 정보를 출력하기 위해 레지스터를 지웁니다.

clrf datind2 ;표시기, 꺼짐과 동일

clrf datind3 ;표시기

clrf datind4 ;음극

bcf INTCON,T0IF ;TMR0 오버플로 인터럽트 플래그 재설정

bsf INTCON,T0IE ;TMR0 오버플로 인터럽트 활성화

bsf INTCON,GIE ; 글로벌 인터럽트 활성화

movlw b"00000110" ; 13.52 출력 예

movlw b"11001111" ;

movlw b"01101101" ;

movlwb"01011011" ;

................. ;

................. ;

................. ;

end ; 전체 프로그램 종료

메인 프로그램에서 우리는 먼저 OPTION_REG 레지스터를 사용하여 타이머를 설정했습니다. 앞서 . 다음으로 각 지표에 대해 1에서 4까지의 카운트를 입력하기 위한 shet 레지스터를 지웁니다. 이 레지스터는 인터럽트 서비스 루틴에서 증가하고 거기에서 조정되므로(1에서 4까지 카운트됨) 이 지우기는 전원을 켠 후 한 번 수행됩니다. 이 레지스터를 기반으로 어떤 지표를 포함할지 결정하고 그에 해당하는 데이터를 발행합니다. 다음 단계는 4개의 표시기에 해당하는 4개의 dataind1,2,3,4 레지스터인 정보 저장 레지스터를 지우는 것입니다. 지우는 것은 표시기를 끄는 것과 같습니다. 인터럽트 서비스 루틴에서 이러한 레지스터의 내용이 표시기 양극이 연결된 PORTB 레지스터로 전송되기 때문입니다. 이는 인터럽트가 활성화된 후 지표에 가비지가 표시되지 않도록 하는 데 필요합니다. 원칙적으로 올바른 정보가 즉시 출력용으로 기록되는 경우에는 수행할 수 없습니다. 다음으로 타이머 오버플로 인터럽트 플래그를 재설정하고 TMR0 오버플로 인터럽트를 활성화하고 마지막으로 글로벌 인터럽트를 활성화합니다.

인터럽트 루틴에서는 어느 것이 켜져 있는지 알 수 없기 때문에 먼저 모든 표시기를 끕니다(트랜지스터 베이스에 낮은 논리 레벨을 적용하여). 우리는 shet 레지스터를 증가시켜 숫자 5와 같은지 확인하고 일치하는 경우 1에서 4까지 세어야하므로 레지스터에 숫자 1을 씁니다. 다음으로 shet에 어떤 숫자가 있는지 확인합니다. PORTB에서 해당 지표에 대한 PORTB 정보 저장 레지스터(dataind)로 데이터를 로드하고 켜는 레지스터. 그런 다음 TMR0 오버플로 인터럽트 플래그를 재설정하고 시간 지연을 위해 타이머에 숫자 100을 쓰고 (이 값의 계산은 아래에 나와 있음) 인터럽트 처리기를 종료합니다. 첫 번째 중단에서 첫 번째 표시등이 켜지고 두 번째 중단에서 두 번째 표시등이 순환 주기로 켜집니다. 메인 프로그램에서는 각 지표에 대한 정보 저장 레지스터에 데이터를 로드하는 것만 남아 있습니다. 인터럽트 서브 루틴에서 키 레지스터의 값을 저장하고 복원하는 것을 잊지 마십시오. 이에 대해 기사에서 썼습니다.

숫자를 출력하려면 데이터 테이블 형식의 문자 생성기를 사용하는 것이 좋습니다. 예를 들어 표시기에 숫자 3456을 표시하려면 숫자로 나누어야 하지만 별도의 레지스터를 사용하여 숫자(0에서 9까지)를 저장한 다음 문자 생성기를 통해 이러한 레지스터를 실행하는 것이 좋습니다. 각 세그먼트를 점화하기 위해 올바른 바이트(dataind 레지스터에 로드됨)를 얻습니다.

클록 생성기의 주파수를 4MHz로 하고 기계 주기는 1μs입니다. 각 표시기의 새로 고침 빈도를 각각 100Hz(주기 T = 10ms)로 하고 필요한 시간 지연은 10/4 = 2.5ms입니다. TMR0의 프리스케일러 계수는 1:16으로 설정되고 가능한 최대 지연은 256x16 = 4096µs이며 2.5ms의 일시 중지가 필요합니다. TMR0에 쓸 수를 계산해 봅시다: 256-((256x2.5)/4.096) = 256-156.25 = 99.75. 반올림 후 숫자 100을 얻습니다.

아래에서 PIC16F628A 마이크로컨트롤러를 사용하여 공통 음극이 있는 4자리 표시기에 동적 표시를 구현한 Proteus 프로그램, 펌웨어 및 소스 코드에 대한 모델을 다운로드할 수 있습니다. 예를 들어 숫자 0000은 표시기에 표시됩니다. 0001; 0002; 13.52; 9764.

이제 8x8 픽셀(LED) 해상도의 매트릭스 연결을 고려하십시오. 행렬의 구조는 일반적으로 행과 열의 관점에서 고려됩니다. 아래 그림에서 각 열에는 모든 LED의 음극이 연결되어 있고 각 행에는 양극이 연결되어 있습니다. 스트링(8개 라인, LED 애노드)은 저항을 통해 마이크로컨트롤러에 연결됩니다. 각 열(LED 음극)은 8개의 트랜지스터를 통해 마이크로컨트롤러에 연결됩니다. 표시 알고리즘은 동일합니다. 먼저 열에서 LED가 켜지는 것에 따라 행에 필요한 논리 수준을 설정한 다음 첫 번째 열을 연결합니다(왼쪽에서 오른쪽으로 표시). 특정 일시 중지 후 열을 끄고 라인의 논리 수준을 변경하여 두 번째 열을 표시한 다음 두 번째 열을 연결합니다. 그래서 교대로 모든 기둥을 통근합니다. 아래는 매트릭스를 마이크로 컨트롤러에 연결하는 다이어그램입니다.


전체적으로 이러한 매트릭스를 연결하려면 16 개의 마이크로 컨트롤러 핀이 필요하므로 상당히 많으므로 제어 라인을 줄이려면 직렬 시프트 레지스터를 사용하는 것이 좋습니다.

가장 일반적인 직렬 레지스터는 데이터 로드를 위한 시프트 레지스터와 데이터가 출력 라인으로 전송되는 홀드 레지스터를 포함하는 74HC595 마이크로 회로입니다. 데이터를 로드하는 것은 간단합니다. SH_CP 클록 입력에서 논리 0을 설정한 다음 DS 데이터 입력에서 필요한 논리 레벨을 설정한 다음 레벨 값(DS 입력에서)을 저장하면서 클록 입력을 1로 전환합니다. 시프트 레지스터 내부. 동시에 데이터가 1비트 이동됩니다. SH_CP 출력을 다시 0으로 재설정하고 DS 입력에서 필요한 레벨을 설정하고 SH_CP를 1로 올립니다. 시프트 레지스터가 완전히 로드된 후(8비트) ST_CP 출력을 1로 설정하면 이 순간 데이터가 저장 레지스터 및 출력 라인 Q0 ... Q7에 공급된 후 ST_CP의 출력을 재설정합니다. 순차 로드 중에 데이터는 Q0에서 Q7로 이동합니다. 핀 Q7'은 시프트 레지스터의 마지막 비트에 연결되며, 이 핀은 두 번째 미세 회로의 입력에 연결될 수 있으므로 한 번에 두 개 이상의 미세 회로에 데이터를 로드할 수 있습니다. OE 핀은 논리 1이 적용될 때 출력 라인을 세 번째(고저항) 상태로 전환합니다.MR 핀은 시프트 레지스터를 재설정하도록 설계되었습니다. , 이는 8개의 0을 로드하는 것과 같습니다. 아래는 초기에 0이 있는 경우 출력 라인 Q0 ... Q7에 값 11010001을 설정하여 74NS595 마이크로 회로에 데이터를 로드하는 다이어그램입니다.


두 개의 74HC595 시프트 레지스터를 사용하여 8×8 매트릭스를 PIC16F628A 마이크로컨트롤러에 연결하는 것을 고려하십시오. 다이어그램은 아래와 같습니다.


데이터는 DD2 칩(행의 논리 레벨 제어, LED 양극)에 로드된 다음 Q7 핀을 통해 각각 DD3(열 제어)로 전송됩니다. 먼저 바이트를 로드하여 열을 활성화한 다음 바이트를 로드합니다. 행의 논리적 수준으로. 트랜지스터 스위칭 매트릭스 열(LED 음극)은 DD3의 출력 라인에 연결됩니다. 다음은 매트릭스에 이미지를 표시하는 프로그램 코드입니다.

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;해상도가 8x8인 매트릭스에 대한 동적 표시 구현 ;클록 생성기의 주파수(예: 4MHz, 기계 주기 1µs org 0000h) ;주소 0000h에서 프로그램 실행 시작 시작으로 이동 ;레이블 시작으로 이동 ;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;루틴 조직 0004h 중단 ;주소 0004h에서 서브루틴 실행 시작 movwf W_TEMP ;키 레지스터 값 저장 swapf STATUS,W ; clrf 상태 ; movwf STATUS_TEMP ; ; movwf FSR_osn ;FSR_osn 레지스터로 movf FSR_prer,W ;FSR_prer 레지스터에서 FSR 레지스터의 이전에 저장된 값 movwf FSR ;복원 ;;;;;;;;;;;;;;;;;;;;;; ;;;;;; ;;;;;;;;;;;;;;;;;;;;;; ;stolb 레지스터의 내용을 칩에 로드 movf stolb,W ;stolb 레지스터의 내용을 복사 movwf var ;레지스터에 var met2 btfsc var,0 ;btfss var,0에 따라 출력 ds 설정 ; bcfds ; bcf sh_cp ; rrf var,F ;시프트 레지스터 var 오른쪽으로 준비;다음 비트는 met2로 이동 ;scetbit가 0이 아님: met2 레이블로 점프 ;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;; ;INDF 레지스터의 내용을 칩에 로드합니다. 카운팅 movwf scetbit ;전송된 비트 met1 btfsc var ,7 ;bsf ds에 따라 출력 ds 설정 ;레지스터의 7번째 비트 값 var btfss var,7 ; bcfds ; bsf sh_cp ;클록 sh_cp 데이터를 래치하기 위한 출력 bcf sh_cp ; rlf var,F ;준비를 위해 레지스터 var를 왼쪽으로 이동;다음 비트 decfsz scetbit,F ;레지스터 조건으로 감소 scetbit goto met1 ;scetbit가 0이 아님: 라벨 met1으로 점프 ; bsf st_cp; 로드된 bcf st_cp 바이트를 74HC595 칩의 출력 라인으로 전송하기 위해 출력 st_cp를 클럭합니다. bcf STATUS,C ;쉬프트 전에 레지스터 상태의 C 비트를 리셋 rrf stolb,F ;왼쪽 쉬프트 레지스터 stolb ; incf FSR,F ;FSR 레지스터 증가, 다음 준비 ;데이터를 74HC595로 보내기 위해 등록 decfsz shet,F ;등록 조건으로 감소 shet goto exxit ;Shet 레지스터가 0이 아님: exxit movlw data1로 점프 ;0과 같은 Shet 레지스터: 먼저 주소 쓰기 movwf FSR ;FSR 레지스터에 정보를 저장하기 위한 레지스터 movlw .8 ;shet 레지스터에 숫자 8 쓰기, movwf shet 유지 ;열 계산 ; exxit bcf INTCON,T0IF ;오버플로 인터럽트 플래그 TMR0 movlw 재설정. 124 ;타이머 레지스터 TMR0 movwf TMR0에 숫자 124 쓰기 ; ; movf FSR,W ;FSR의 현재 값 저장 movwf FSR_prer ;FSR_prer로 movf FSR_osn ,W ;이전에 저장된 값 복원 movwf FSR ;FSR_osn에서 FSR ; swapf STATUS_TEMP,W ; 키 레지스터의 내용 복원 movwf STATUS ; 스왑프 W_TEMP,F ; 스왑프 W_TEMP,W ; ; retfie ;인터럽트 서브루틴 종료;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;메인 프로그램 시작 ............. ;레지스터의 초기 설정 ................. ;특수 목적 ..... ............ bsf STATUS,RP0 ;이진수 11010011을 레지스터 movlw b"11010010"에 기록 ;OPTION_REG, 이로써 내부 movwf OPTION_REG 설정 ;TMR0에 대한 클럭 소스 bcf STATUS,RP0 ;전에 프리스케일러 활성화 TMR0, 프리스케일러 비율을 1:8로 설정합니다. movlw .8 ;shet 레지스터에 숫자 8 쓰기, movwf shet 시작 전;tmr0 오버플로 인터럽트, 실행;한 번, 전원 켜기 후 movlw b"10000000" ;이진수 10000000을 movwf stolb에 쓰기 ;stolb 레지스터, 첫 번째 열 활성화; is 전원을 켠 후 한 번 수행; movlw data1 ;FSR_prer 레지스터에 첫 번째 레지스터(스토리지 레지스터 movwf FSR_prer; 정보)의 주소 쓰기, 수행, 전원 켜기 후 한 번; movlw .8 ;movlw data1 ;matrix movwf FSR을 끄는 것과 같은 movwf tmp ;matrix로 출력되는 정보의 8 레지스터 지우기 ; met3 clrf INDF ; incf FSR,F ; decfsz tmp,F ; goto met3 ; ; bcf INTCON,T0IF ;TMR0 오버플로 인터럽트 플래그 지우기 bsf INTCON,T0IE ;TMR0 오버플로 인터럽트 활성화 bsf INTCON,GIE ;글로벌 인터럽트 활성화; m1 movlw data1 ;R 출력 예 movwf FSR ; movlw b"00000000" ; movwf INDF ; incf FSR,F ; movlw b"01111111" ; movwf INDF ; incf FSR,F ; movlwb"00001001" ; movwf INDF ; incf FSR,F ; movlwb"00011001" ; movwf INDF ; incf FSR,F ; movlwb"00101001" ; movwf INDF ; incf FSR,F ; movlw b"01000110" ; movwf INDF ; incf FSR,F ; movlw b"00000000" ; movwf INDF ; incf FSR,F ; movlw b"00000000" ; movwf INDF ; ; ...; ...; ...; ; end ; 전체 프로그램의 끝;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;8x8 해상도의 매트릭스에 대한 동적 표시 구현

;예제 클록 주파수 4MHz, 머신 사이클 1µs

org 0000h ;주소 0000h에서 프로그램 실행 시작

시작으로 이동 ;레이블 시작으로 이동

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;인터럽트 루틴

org 0004h ;주소 0004h에서 서브루틴 실행 시작

movwf W_TEMP ;키 레지스터 값 저장

swapf 상태,W ;

movwf STATUS_TEMP ;

movf FSR,W ;FSR 레지스터의 현재 값 저장

movwf FSR_osn ;FSR_osn 레지스터로

movf FSR_prer,W ;이전에 저장된 값을 복원

movwf FSR ;FSR_prer의 FSR

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;74HC595(직렬 시프트 레지스터)

movf stolb,W ; stolb 레지스터의 내용 복사

movwf var ; var 등록

movlw .8 ;계산을 위해 scetbit 레지스터에 숫자 8 쓰기

movwf scetbit ;전송된 비트

met2 btfsc var,0 ;다음에 따라 ds 출력 설정

bsf ds ; 레지스터 var의 7번째 비트 값

bsf sh_cp ;클록 sh_cp 데이터를 래치하기 위한 출력

rrf var,F ; 준비를 위해 레지스터 var를 오른쪽으로 이동

;다음 비트

decfsz scetbit,F ;scetbit 레지스터 조건으로 감소

goto met2; scetbit가 0이 아님: met2 레이블로 이동

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;74HC595(직렬 시프트 레지스터)

movf INDF,W ; 레지스터 INDF의 내용 복사

movwf var ; var 등록

movlw .8 ;계산을 위해 scetbit 레지스터에 숫자 8 쓰기

movwf scetbit ;전송된 비트

met1 btfsc var,7 ;다음에 따라 ds 출력 설정

bsf ds ; 레지스터 var의 7번째 비트 값

bsf sh_cp ;클록 sh_cp 데이터를 래치하기 위한 출력

rlf var,F ;왼쪽 시프트 var 준비

;다음 비트

decfsz scetbit,F ;scetbit 레지스터 조건으로 감소

goto met1 ;scetbit가 0이 아님: met1 레이블로 이동

bsf st_cp ;로드된 전송을 위해 st_cp의 출력 클럭

bcf st_cp ;74HC595 출력 라인당 바이트

bcf STATUS,C ; 이동하기 전에 상태 레지스터의 C 비트를 지웁니다.

rrf stolb,F ;왼쪽 시프트 레지스터 stolb

incf FSR,F ;FSR 레지스터 증가, 다음 준비

; 74HC595로 데이터를 보내기 위해 등록

decfsz shet,F ;등록 조건 shet로 감소

goto 종료 ;shet 레지스터가 0이 아님: 종료로 점프

movlw data1 ;shet 레지스터는 0: 첫 번째 주소 쓰기

movwf FSR ;FSR에 정보를 저장하기 위해 등록

movlw .8 ;참조용으로 shet 레지스터에 숫자 8을 씁니다.

movwf 시트 ;열 수

movlw b"10000000" ;이진수 10000000을 에 씁니다.

movwf stolb ;stolb 등록, 첫 번째 열 포함

exxit bcf INTCON,T0IF ;TMR0 오버플로 인터럽트 플래그 재설정

movlw .124 ;타이머 레지스터 TMR0에 숫자 124 쓰기

movf FSR,W ;FSR 레지스터의 현재 값 저장

movwf FSR_prer ;FSR_prer 레지스터로

movf FSR_osn ,W ;이전에 저장된 값을 복원

movwf FSR ;FSR_osn의 FSR

swapf STATUS_TEMP,W ; 키 레지스터의 내용 복원

스왑프 W_TEMP,F ;

스왑프 W_TEMP,W ;

retfie ; 종료 인터럽트 루틴

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;메인 프로그램

시작 .................. ;레지스터의 초기 설정

................. ;특수 목적

.................

bsf STATUS,RP0 ;레지스터에 이진수 11010011 쓰기

movlw b"11010010" ;OPTION_REG, 내부 설정

movwf OPTION_REG ; TMR0용 클럭 소스

bcf STATUS,RP0 ;TMR0 이전에 프리스케일러 활성화

;프리스케일러 비율을 1:8로 설정

movlw .8 ;실행하기 전에 shet 레지스터에 숫자 8을 씁니다.

movwf shet ; TMR0 오버플로 인터럽트, 실행 중

;전원을 켠 후 한 번

movlw b"10000000" ;이진수 10000000을 에 씁니다.

movwf stolb ;stolb 등록, 첫 번째 열 포함

각 열의 행에 대한 논리적 수준의 정보는 8개의 정보 저장 레지스터에 저장되며 이를 통해 액세스할 수 있습니다. 첫 번째 레지스터의 주소 이름은 data1입니다. shet 및 stolb 레지스터의 초기 쓰기 외에도 첫 번째 정보 저장 레지스터의 주소를 FSR_prer 레지스터에 쓰는 것이 필요합니다(레지스터는 data1, FSR_prer의 항목은 한 번 수행된 다음 핸들러) 이후에만 TMR0 오버플로 인터럽트를 허용합니다.

인터럽트를 활성화하기 전에 정보 저장 레지스터를 지우는 것이 바람직합니다. 이 작업은 추가 tmp 레지스터(카운터로)와 간접 주소 지정을 사용하여 수행되며 지우는 것은 매트릭스를 끄는 것과 같습니다.

인터럽트 처리 루틴에서 우리는 stolb 레지스터의 내용을 DD2 칩에 로드합니다(인터럽트를 활성화한 후 핸들러에 처음 들어가면 위에서 언급한 대로 레지스터에 숫자 10000000이 포함됨). 로딩은 stolb 레지스터의 하위 비트부터 시작하는데, 로딩되면서 Q0에서 Q7 방향으로(DD2 칩 내부) 이동하는데, 로딩 알고리즘은 위에서 다뤘으니 코드를 이해하는데 어렵지 않을 것 같다. . 다음으로 INDF 레지스터의 내용을 DD2에 로드합니다. 이것은 FSR에 주소가 있는 정보 저장 레지스터 중 하나입니다(인터럽트를 활성화한 후 핸들러에 처음 들어갈 때 FSR에는 첫 번째 주소가 포함됩니다. data1)라는 정보 저장 레지스터. 로딩은 INDF 레지스터의 상위 비트부터 시작됩니다. 고려 된 2 바이트를로드 한 후 st_cp 출력을 기록하여 다운로드 된 데이터가 DD2, DD3 마이크로 회로의 출력 라인으로 전송됩니다. 따라서 핸들러에 대한 첫 번째 입력에서 매트릭스의 첫 번째 열이 전환되어 data1 레지스터의 내용에 따라 높은 논리 레벨이 있는 양극에서 LED가 켜집니다( 첫 번째 정보 저장 레지스터).

다음으로, 인터럽트 처리기의 다음 항목에서 전환할 행렬의 두 번째 열을 준비하기 위해 stolb 레지스터를 오른쪽으로 1비트 이동합니다. STATUS 레지스터의 C 플래그는 이 플래그를 통해 시프트가 발생하고 시프트 시 그 상태를 알 수 없기 때문에 시프트 전에 클리어해야 합니다. 이동 후 FSR 레지스터를 증가시켜 두 번째 열에 대한 논리적 행 레벨을 가진 다음 저장 레지스터(data1 레지스터 뒤)를 준비합니다. 다음으로 조건으로 shet 레지스터를 감소시키고 0이 아니면 TMR0 오버플로 인터럽트 플래그를 재설정하고 타이머에 숫자를 쓰고 인터럽트 처리기를 종료합니다.

다음에 핸들러를 입력하면 매트릭스의 두 번째 열이 활성화됩니다. shet 레지스터가 재설정되면 (8 번째 열 전환 후) 다음 열 전환주기에 대해 숫자 8이 기록되고 stolb 레지스터의 값이 수정되며 첫 번째 정보 저장 레지스터의 주소 ( data1)이 FSR 레지스터에 기록됩니다.

TMR0 타이머의 시간 지연을 계산해 보겠습니다. 클록 주파수는 4MHz이고 기계 주기는 1µs입니다. LED 깜박임을 방지하기 위해 각 열의 새로 고침 빈도를 100Hz(주기 T=10ms)로 가정하고 시간 지연은 10/8 = 1.25ms입니다. 프리스케일러 비율 TMR0을 1:8로 설정하고 가능한 최대 지연은 256x8 = 2048 µs입니다. 1.25ms의 일시 중지 동안 타이머는 (256x1.25) / 2.048 = 156.25번을 계산해야 하며 반올림하면 156개를 얻습니다. 따라서 타이머에 256-156 = 100이라는 숫자를 써야 하는데 인터럽트 루틴을 실행하는 데 시간이 걸리기 때문에 이 값은 정확하지 않습니다. 프리스케일러 계수를 고려하면 190/8 = 23.75 또는 24 카운트를 얻습니다. TMR0에 쓸 올바른 값은 100+24=124입니다.

메인 프로그램에서 매트릭스에 표시하려는 내용에 따라 8개의 정보 저장 레지스터를 작성합니다. 아래는 위의 코드에 대한 정보를 행렬로 출력하는 것을 설명하는 그림입니다.


시프트 레지스터 외에도 7 세그먼트 표시기 및 LED 매트릭스에 대한 정보를 표시하는 특수 드라이버가 있습니다. 이 경우 드라이버 자체가 동적 표시를 구현하며 남은 것은 표시를 위해 데이터를 보내는 것입니다. 에 대한 기사에서 이러한 인기 있는 드라이버 중 하나를 검토했습니다.

링크 아래에서 두 개의 74HC595 시프트 레지스터를 사용하여 8x8 매트릭스에 동적 표시를 구현하여 PIC16F628A 마이크로 컨트롤러의 펌웨어 및 소스 코드를 다운로드할 수 있습니다. 연결 다이어그램은 위에서 논의되었습니다. 문자 R, L, 숫자 46, 스마일, 십자가 형태의 패턴이 매트릭스에 번갈아 표시되며 이 애니메이션은 아래 비디오에 표시됩니다.

태그 포함 , . 읽다 .

8x8 매트릭스 LED 디스플레이는 다양한 크기로 제공되며 재미있게 작업할 수 있습니다. 대형 산업용 어셈블리의 크기는 약 60 x 60mm입니다. 그러나 훨씬 더 큰 LED 어레이를 찾고 있다면 찾기가 어렵습니다.

이 프로젝트에서 우리는 서로 직렬로 연결된 여러 개의 대형 8x8 LED 모듈로 구성된 매우 큰 LED 매트릭스 LED 디스플레이를 구축할 것입니다. 각 모듈의 크기는 약 144 x 144mm입니다.

이 디스플레이의 특징은 필요에 따라 그 뒤의 배경을 볼 수 있다는 점이다. 이렇게 하면 디스플레이 뒤에서 일어나는 일을 볼 수 있도록 유리 패널 앞에 디스플레이를 배치하는 등 이러한 디스플레이를 창의적으로 사용할 수 있습니다.

이 프로젝트에서는 10mm를 사용합니다. 다른 크기도 사용할 수 있습니다. 일반적으로 사용 가능한 크기는 3mm, 5mm, 8mm 및 10mm입니다.

디스플레이가 마이크로컨트롤러와 함께 작동하도록 설계되지는 않았지만 널리 사용되는 Arduino 보드를 사용하고 신호선 3개만 사용하여 SPI를 통해 연결합니다.

이 프로젝트를 구축하려면 전자 및 부품 납땜에 대한 기본 지식과 Arduino 사용에 대한 약간의 지식이 필요합니다. 펌웨어 .

여기에서 LED의 긴 다리를 사용하여 LED를 함께 납땜해야 합니다. 모든 LED 크기와 색상을 사용할 수 있지만 다리 길이(23mm 이상)는 구부려 납땜할 수 있을 만큼 길어야 합니다. LED는 8x8 매트릭스 형태로 배열되어 있으며 음극은 행용으로, 양극은 열용으로 함께 납땜됩니다.

MAX7219 드라이버는 LED 매트릭스의 동적 표시를 제어합니다. 설계 시 각 8x8 LED 매트릭스는 다음 구성 요소를 사용하는 회로를 기반으로 합니다.

  • 1 x MAX7219
  • 1 x 10uF 16V 전해 커패시터
  • 1 x 0.1UF 세라믹 커패시터
  • 1 x 12kΩ 저항(0.25W)
  • 1 x 24핀 DIP IC 소켓

사용 중인 LED와 함께 작동하려면 다른 저항 값을 선택해야 할 수도 있습니다. 이 저항은 LED로 출력될 MAX7219의 최대 전류를 제한합니다.

그리고 이 비디오는 LED 매트릭스, 전자 제어 보드의 설치 방법과 널리 사용되는 Arduino UNO/Nano 보드를 사용하여 실행하는 간단한 테스트를 명확하게 보여줍니다.


이 변환기의 중요한 장점 중 하나는 실제로 튜닝이 필요하지 않고 전체 설정이 마이크로 회로의 주파수 설정 커패시터 선택으로 귀결되며 커패시턴스가 증가함에 따라 원하는 주파수로 조정된다는 것입니다. 이 커패시터는 주파수가 감소하고 증가함에 따라 증가합니다.



관련 기사: